首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby散列自动生成(facets)

ruby散列自动生成(facets)
EN

Stack Overflow用户
提问于 2009-10-01 12:29:37
回答 3查看 2.6K关注 0票数 8

这里有一个聪明的技巧,可以在ruby中启用哈希自动生动(取自facets):

代码语言:javascript
复制
  # File lib/core/facets/hash/autonew.rb, line 19
  def self.autonew(*args)
    leet = lambda { |hsh, key| hsh[key] = new( &leet ) }
    new(*args,&leet)
  end

虽然它可以工作(当然),但我发现我真的很沮丧,因为我不能弄清楚这两个liner是如何实现它的功能的。

将leet设置为默认值。因此,只要访问h['new_key'],就会以某种方式将其打开并创建'new_key' => {}

现在,我希望h['new_key']返回默认值对象,而不是计算它。也就是说,不会自动创建'new_key' => {}。那么leet实际上是如何被调用的呢?尤其是有两个参数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-01 12:49:03

标准new method for Hash接受一个块。在尝试访问Hash中不存在的键时,将调用此块。向该块传递Hash本身和所请求的键(两个参数),并且应该返回应该为所请求的键返回的值。

您将注意到leet lambda做了两件事。它返回一个新的散列,并将leet本身作为处理缺省值的块。这就是允许autonew对任意深度的散列工作的行为。它还将这个新的散列分配给hsh[key],以便下次您请求相同的键时,您将获得现有的散列,而不是正在创建的新散列。

票数 18
EN

Stack Overflow用户

发布于 2009-10-21 10:28:57

还值得注意的是,可以将此代码转换为一行代码,如下所示:

代码语言:javascript
复制
def self.autonew(*args)
  new(*args){|hsh, key| hsh[key] = Hash.new(&hsh.default_proc) }
end

对Hash#default_proc的调用返回用于创建父对象的过程,因此我们在这里有一个很好的递归设置。

我在我的博客上谈到了这一点的similar case

票数 8
EN

Stack Overflow用户

发布于 2013-07-26 04:00:05

或者,您可以考虑我的xkeys gem。它是一个模块,您可以使用它来扩展数组或散列,以促进嵌套访问。

如果你寻找一些还不存在的东西,你会得到一个nil值(或者另一个值,或者一个异常,如果你喜欢的话),而不会通过查找来创建任何东西。它还可以追加到数组的末尾。

您可以选择为整型键自动生成散列或数组(但对于整个结构只能自动生成一次)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1503671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档