1. ホーム
  2. ルビー

[解決済み】Rubyでハッシュをコピーする方法は?

2022-04-09 18:29:28

質問

私はrubyの初心者です(今はrakeスクリプトを書いています)。ほとんどの言語では、コピーコンストラクタは簡単に見つけることができます。30分検索しても、rubyでは見つかりませんでした。私はハッシュのコピーを作成し、元のインスタンスに影響を与えることなくそれを変更できるようにしたいです。

意図したとおりに動作しない期待されるメソッドもある。

h0 = {  "John"=>"Adams","Thomas"=>"Jefferson","Johny"=>"Appleseed"}
h1=Hash.new(h0)
h2=h1.to_hash

とりあえず、このような不格好な回避策に頼りました。

def copyhash(inputhash)
  h = Hash.new
  inputhash.each do |pair|
    h.store(pair[0], pair[1])
  end
  return h
end

解決方法は?

その clone メソッドは、Ruby の標準的なビルトイン方法で シャローコピー :

irb(main):003:0> h0 = {"John" => "Adams", "Thomas" => "Jefferson"}
=> {"John"=>"Adams", "Thomas"=>"Jefferson"}
irb(main):004:0> h1 = h0.clone
=> {"John"=>"Adams", "Thomas"=>"Jefferson"}
irb(main):005:0> h1["John"] = "Smith"
=> "Smith"
irb(main):006:0> h1
=> {"John"=>"Smith", "Thomas"=>"Jefferson"}
irb(main):007:0> h0
=> {"John"=>"Adams", "Thomas"=>"Jefferson"}

なお、この動作はオーバーライドすることができます。

このメソッドは、クラス固有の動作を持つことがあります。もしそうであれば、その動作は #initialize_copy メソッドを使用します。