亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Ruby中復制哈希?

如何在Ruby中復制哈希?

紅糖糍粑 2019-12-25 15:09:46
我承認我是一個紅寶石新手(現在正在編寫rake腳本)。在大多數語言中,復制構造函數很容易找到。半小時的搜索未在紅寶石中找到它。我想創建哈希的副本,以便可以修改它而不影響原始實例。一些預期的方法無法按預期工作: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 hend
查看完整描述

3 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

該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在該類的方法下記錄該行為。


查看完整回答
反對 回復 2019-12-25
?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

正如其他人指出的那樣,clone會做到的。請注意,clone哈希會產生淺表副本。也就是說:


h1 = {:a => 'foo'} 

h2 = h1.clone

h1[:a] << 'bar'

p h2                # => {:a=>"foobar"}

發生的事情是哈希的引用被復制,而不是引用所引用的對象。


如果要深拷貝,請執行以下操作:


def deep_copy(o)

  Marshal.load(Marshal.dump(o))

end


h1 = {:a => 'foo'}

h2 = deep_copy(h1)

h1[:a] << 'bar'

p h2                # => {:a=>"foo"}

deep_copy適用于任何可編組的對象。大多數內置數據類型(數組,哈希,字符串等)都可以編組。


編組是Ruby的序列化名稱。通過編組,對象及其引用的對象將轉換為一系列字節;這些字節然后用于創建另一個對象,例如原始對象。


查看完整回答
反對 回復 2019-12-25
?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

哈??梢詮默F有哈希創建新哈希:


irb(main):009:0> h1 = {1 => 2}

=> {1=>2}

irb(main):010:0> h2 = Hash[h1]

=> {1=>2}

irb(main):011:0> h1.object_id

=> 2150233660

irb(main):012:0> h2.object_id

=> 2150205060


查看完整回答
反對 回復 2019-12-25
  • 3 回答
  • 0 關注
  • 927 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號