1. ホーム
  2. ルビー

[解決済み】Rubyのdupメソッドとcloneメソッドの違いとは?

2022-04-06 16:37:01

質問

その のRubyドキュメント dup と言ってください。

一般的には clonedup は、子孫のクラスで異なるセマンティクスを持つことがあります。一方 clone は、内部状態を含めてオブジェクトを複製するために使用されます。 dup 通常、新しいインスタンスを作成するために子孫オブジェクトのクラスを使用します。

でも、テストしてみたら、実は同じだったんです。

class Test
   attr_accessor :x
end

x = Test.new
x.x = 7
y = x.dup
z = x.clone
y.x => 7
z.x => 7

では、この2つの方式にはどのような違いがあるのでしょうか。

どのように解決するのか?

サブクラスは、これらのメソッドをオーバーライドして、異なるセマンティクスを提供することができます。で Object 自体には、2つの重要な違いがあります。

まず1つ目。 clone はシングルトン・クラスをコピーし、一方 dup はしません。

o = Object.new
def o.foo
  42
end

o.dup.foo   # raises NoMethodError
o.clone.foo # returns 42

2つ目 clone は凍結状態を保持するのに対し dup を使用しません。

class Foo
  attr_accessor :bar
end
o = Foo.new
o.freeze

o.dup.bar = 10   # succeeds
o.clone.bar = 10 # raises RuntimeError

これらのメソッドに対する Rubinius の実装 というのも、この実装は非常に明快であり、Rubyの実装にかなり準拠しているからです。