【问题标题】:Return self (rather than nil) from Hash#[] when key doesn't exist当键不存在时,从 Hash#[] 返回 self(而不是 nil)
【发布时间】:2013-08-26 17:08:52
【问题描述】:

通常,当一个元素被传递到没有匹配键的散列中时,散列返回nil

hsh = {1 => "one", 2 => "two"}
hsh[3] #=> nil

我想形成一个散列,如果没有匹配,则返回传递给它的值。

hsh[3] #=> 3

我猜这个解决方案可能涉及某种 lambda...?

** 现在我正在为此使用一个笨拙的解决方案,它使用条件方法来防止不匹配的键被传递到哈希中..

【问题讨论】:

  • 您想修改 Hash 类本身还是对其他获取方法持开放态度?
  • 只要解决方案的代码简短,我愿意接受

标签: ruby hash


【解决方案1】:

如果您只想返回新值而不是添加它们:

 h = Hash.new { |_hash, key| key }

要最初填充此哈希,您可以这样做:

 h.merge( {1 => "one", 2 => "two"} )

如果哈希已经创建*:

 h.default_­proc = proc do |_hash,key|
     key
 end

#h[3]
#=> 3

*仅在 ruby​​ 1.9 及更高版本中

【讨论】:

  • 为什么不能使用 lambda?
  • @boulder_ruby 为什么要使用lambda?建议的解决方案更简单。在内部,Hash.new 可能会执行类似于 proclambda 的操作,而无需显式创建机制。
  • lambda 主要是proc,所以你也可以在那里使用它。
  • @iamnotmaynard,如果已经创建了哈希(假设它被称为old_hash,您将按照上面的方法创建新的哈希,然后执行h.merge(old_hash)
  • 这不仅仅是一种好的做法。未使用的局部变量会触发警告,除非它们以下划线开头。
【解决方案2】:

试试这个:

hsh.default_proc = proc do |hash, key|
  hash[key] = key
end

只返回密钥,这是一个微不足道的改变:

hsh.default_proc = proc do |hash, key|
  key
end

【讨论】:

  • 我不确定 OP 是否要添加该密钥,只需返回它。
  • 这行得通吗?我试过了(两个例子),但他们都没有按照 OP 的要求做。
  • 但是从那个链接:“不可能将默认值设置为将在每次键查找时执行的 Proc。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
相关资源
最近更新 更多