Ruby 想问一个 Hash default 方法的问题

bysxiang · 2016年10月09日 · 最后由 mizuhashi 回复于 2016年10月10日 · 1591 次阅读
h = Hash.new('java')
h[:a] = 33

h.default() #=> 'java'

h.default(:a) #=> 'java'
h.default(:b) #=> 'java'

按Ruby文档说法,default()不提供参数,或参数(key)不存在时,返回默认值。key存在,返回键对应的值。

可结果却不一样,这是bug吗? ruby-2.0.0-p648, ruby-2.3 都是一样的结果

共收到 8 条回复

If obj is specified, this single object will be used for all default values

所以要用 block 的形式:

Hash.new { |h, k| h[k] = 'java' }

好像确实是文档与实现不一致饿,,, =。=

.default(:a) 哈希是这样存取的?

[1] pry(main)> h = Hash.new('java')
=> {}
[2] pry(main)> h[:a] = 33
=> 33
[3] pry(main)> h
=> {:a=>33}
[4] pry(main)> h.default(:a)
=> "java"
[5] pry(main)> h.default
=> "java"
[6] pry(main)> h[:b]
=> "java"
[7] pry(main)> h[:a]
=> 33
[8] pry(main)> h[:c]
=> "java"

#3楼 @mizuhashi 这是获取默认值的。

Supplemental notes

To clarify: When called with no argument, it returns the default value. When called with a hash key it returns the corresponding value for that key if the hash contains that key. Only if the key does not exist does it return the default value.

官方原文,。。。。郁闷

#1楼 @tony612 这样来看,default(key = nil),不知道还要这参数干嘛。

#7楼 @bysxiang 默认值可以是代码块,要代入key求值

bysxiang 关闭了讨论 10月10日 13:42
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册