【问题标题】:Initialize object within Hash在 Hash 中初始化对象
【发布时间】:2021-05-07 09:11:59
【问题描述】:

哪种方式更好?或者你知道更多更好的方法吗?

data = Hash.new { |h, k| h[k] = Hash.new { |h2, k2| h2[k2] = [] } } # 5 or more times

def object_in_hash(&object)
        Hash.new { |h, k| h[k] = object.call() }
end
data = object_in_hash do object_in_hash do [] end end

【问题讨论】:

  • 请描述什么是“更好”?
  • 替代“更好” - 不要使用Hash,而是创建专用类型(类,结构)
  • 也许您想参加一些比赛,只是为了了解“更好”做什么?
  • @Kodai :您是否尝试在 Perl 中实现类似于 autovivification 的东西,即制作 Hash,它会在引用密钥时自动创建一个新的子哈希,这确实还不存在?
  • 我的意思是“更好”就是“更易读”。

标签: ruby dry code-readability


【解决方案1】:

您可以通过将 default_proc 传递给新实例来创建无限嵌套的哈希:

data = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }

这使您可以将值分配给任意键:

data[:foo][:bar][:baz] = []
data[:foo][:bar][:qux] = []

data #=> {:foo=>{:bar=>{:baz=>[], :qux=>[]}}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 2013-06-27
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多