ただのエイリアスかと思っていたら、微妙に挙動が違うそうだ。
class Foo
def initialize
@msg = 'foo'
end
attr_accessor :msg
end
org = Foo.new
def org.disp
print @msg, "\n"
end
org.freeze
cloned_obj = org.clone
begin
cloned_obj.msg = 'clone'
rescue
print "cannot modify cloned_obj\n"
end
cloned_obj.disp
duplicated_obj = org.dup
duplicated_obj.msg = 'dup'
begin
duplicated_obj.disp
rescue
print "cannot call disp\n"
end
cloneはfreezeした状態と特異メソッドを含めて複製するが、dupはそれらを複製しない。したがって、上の例だとcloned_objはfrozenなので変更出来ず、duplicated_objはdispメソッドが未定義となる。
0 件のコメント:
コメントを投稿