在Ruby中,为了创建数组哈希并将元素推送到这些数组上,我看到了两个成语.我想知道人们更喜欢哪一个,以及为什么.(披露:我有自己的看法,但我想确保我没有遗漏一些明显的东西.)
方法1:使用Hash的花式初始化程序:
ht = Hash.new {|h,k| h[k]=[]}
ht["cats"] << "Jellicle"
ht["cats"] << "Mr. Mistoffelees"
Run Code Online (Sandbox Code Playgroud)
当您使用尚不存在的密钥访问ht时,此方法会创建一个空数组.
方法2:简单的初始化器,花哨的访问器:
ht = {}
(ht["cats"] ||= []) << "Jellicle"
(ht["cats"] ||= []) << "Mr. Mistoffelees"
Run Code Online (Sandbox Code Playgroud)
人们对哪一个更好(或者哪一个优先于另一个)有意见?
ste*_*lag 19
有时哈希最初用数据填充,稍后它只用于检索数据.在那些情况下,我更喜欢第一种可能性,因为默认的proc可以"清空"(在Ruby 1.9中).
ht = Hash.new {|h,k| h[k]=[]}
ht["cats"] << "Jellicle"
ht["cats"] << "Mr. Mistoffelees"
ht["dogs"]
p ht
#=> {"cats"=>["Jellicle", "Mr. Mistoffelees"], "dogs"=>[]}
ht.default_proc = proc{}
ht["parrots"] #nil
p ht
#=> {"cats"=>["Jellicle", "Mr. Mistoffelees"], "dogs"=>[]} No parrots!
Run Code Online (Sandbox Code Playgroud)
在OP中,我说我有自己的看法。这里是。
尽管“花式初始化程序”方法很优雅,但它可能会导致一些非常意外的行为——特别是在您不期望的情况下生成键——并且无法通过查看哈希表来了解这一点。
考虑以下:
>> ht1 = Hash.new {|h,k| h[k]=[]}
>> ht2 = {}
>> ht1["cats"] << "Jellicle"
=> ["Jellicle"]
>> (ht2["cats"] ||= []) << "Jellicle"
=> ["Jellicle"]
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利——ht1 和 ht2 是相同的。但:
>> ht1["dogs"] ? "got dogs" : "no dogs"
=> "got dogs"
>> ht2["dogs"] ? "got dogs" : "no dogs"
=> "no dogs"
Run Code Online (Sandbox Code Playgroud)
请注意,简单地访问 ht1[some_key] 会更改哈希表的状态,即它会创建一个新条目。您可能会争辩说最终用户应该始终使用 has_key?() 来测试哈希条目的存在——你是对的——但上述用法是公认的习惯用法。哈希表自动创建一个条目将是一个意想不到的副作用,所以如果哈希表暴露给最终用户,你应该小心。(但是请注意,steenslag 的回答显示了如何将其关闭。)
| 归档时间: |
|
| 查看次数: |
22116 次 |
| 最近记录: |