2012年12月5日水曜日

Rubyのcloneとdup

ただのエイリアスかと思っていたら、微妙に挙動が違うそうだ。

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 件のコメント:

コメントを投稿