oop/clone_semantics.rb
tests/_examples/oop/clone_semantics.rb in the metorex repository.
class Widget
attr_accessor :parts
def initialize
@parts = ["a"]
end
end
widget = Widget.new
def widget.special
:the_one
end
copy = widget.clone
puts copy.special
puts widget.dup.respond_to? :special
frozen = Widget.new.freeze
puts frozen.clone.frozen?
puts frozen.clone(freeze: false).frozen?
puts Widget.new.clone(freeze: true).frozen?
puts Widget.new.clone(freeze: nil).frozen?
begin
widget.clone(freeze: 1)
rescue ArgumentError => error
puts error.message
end
class Tracked
def initialize_clone(other, **options)
$recorded = options
end
end
Tracked.new.clone(freeze: true)
puts $recorded[:freeze]
class OnlyOne
def initialize_clone(other)
:ignored
end
end
begin
OnlyOne.new.clone(freeze: true)
rescue ArgumentError => error
puts error.message
end
base = Class.new do
def label
["base"]
end
end
object = base.new
object.define_singleton_method(:label) do
["singleton", *super()]
end
p object.label
p object.clone.label
Output:
the_one
false
true
false
true
false
unexpected value for freeze: Integer
true
wrong number of arguments (given 2, expected 1)
["singleton", "base"]
["singleton", "base"]