如何分配 hash['a']['b']= 'c'如果 hash['a'] 不存在?
有没有比更简单的方法
if hash.key?('a')
hash['a']['b'] = 'c'
else
hash['a'] = {}
hash['a']['b'] = 'c'
end
Is there any way simpler than
if hash.key?('a')
hash['a']['b'] = 'c'
else
hash['a'] = {}
hash['a']['b'] = 'c'
end
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
最简单的方法是使用块参数构造哈希 :
此
new
表单创建一个新的空哈希作为默认值。您不希望这样:因为这将为所有默认条目使用完全相同哈希。
另外,正如 Phrogz 所指出的,您可以使用
default_proc
:更新:我想我应该澄清我对
Hash.new({ })
的警告。当你这样说时:这很像这样说:
然后,当你访问
h
将某些内容分配为h[:k][:m] = y
时,它行为就好像您这样做了:然后,如果您
h[:k2][:n] = z
,您最终将分配h.default[:n] = z< /代码>。请注意,
h
仍然表示h.has_key?(:k)
为 false。但是,当您这样说时:
一切都会顺利进行,因为您永远不会在此处修改
h[k]
,您只会从h
读取一个值(其中如果需要,将使用默认值)或为h
分配一个新值。The easiest way is to construct your Hash with a block argument:
This form for
new
creates a new empty Hash as the default value. You don't want this:as that will use the exact same hash for all default entries.
Also, as Phrogz notes, you can make the auto-vivified hashes auto-vivify using
default_proc
:UPDATE: I think I should clarify my warning against
Hash.new({ })
. When you say this:That's pretty much like saying this:
And then, when you access
h
to assign something ash[:k][:m] = y
, it behaves as though you did this:And then, if you
h[:k2][:n] = z
, you'll end up assigningh.default[:n] = z
. Note thath
still says thath.has_key?(:k)
is false.However, when you say this:
Everything will work out okay because you will never modified
h[k]
in place here, you'll only read a value fromh
(which will use the default if necessary) or assign a new value toh
.一个简单的,但 hash 应该是一个有效的 hash 对象
a simple one, but hash should be a valid hash object
如果您按如下方式创建
hash
,并使用新的(相同默认值)哈希的默认值:(感谢 Phrogz 的更正;我的语法错误)那么您
无需任何额外的操作 即可完成代码。
If you create
hash
as the following, with default value of a new (identically default-valued) hash: (thanks to Phrogz for the correction; I had the syntax wrong)Then you can do
without any additional code.
这里的问题是:
Ruby 中是否可以像 PHP 中那样自动初始化多维哈希数组?
提供了一个非常有用的 AutoHash 实现来执行此操作。
The question here:
Is auto-initialization of multi-dimensional hash array possible in Ruby, as it is in PHP?
provides a very useful
AutoHash
implementation that does this.一旦你定义了它,一切都会自动进行。但请注意,从现在开始,
nil
在用作哈希时将表现为空哈希。Once you defined that, everything will work automatically. But be aware that from now on
nil
would behave as an empty hash when used as a hash.