Ruby:嵌套哈希

问题描述 投票:0回答:1

谁能解释一下这段代码在 Ruby 中的作用吗?


x = ->(h, k) { h[k] = Hash.new(&x) }

@abc = Hash.new(&x)

我已经搜索过,但无法弄清楚那里到底发生了什么。 我认为它是为了创建嵌套哈希?

另外,如果我想用 Python 编写它,这将如何翻译?

python ruby dictionary hashmap
1个回答
0
投票

使用 ruby 代码,您将创建一个新的哈希(Python 等效项是一个映射),其动态默认值由传递给

Hash.new
的 lambda 定义。在 Python 中,这可以被视为传递给构造函数的(匿名)函数。

每次在哈希中访问未定义的键时都会调用此 lambda(带有一些此处不重要的间接寻址)。假定 lambda 返回的值是键的值。 lambda 还具有将默认值添加到哈希中的副作用。

因此,这与 Python 中的 defaultdict 集合非常相似。

现在,默认值将始终是一个新的哈希对象,再次设置为在访问未定义的键时设置并返回新的哈希对象:

x = ->(h, k) { h[k] = Hash.new(&x) }
@abc = Hash.new(&x)

@abc[:a]
# => {}

@abc[:b]
# => {}

@abc[:a].equal? @abc[:a]
=> true

@abc[:a].equal? @abc[:b]
=> false

@abc[:custom] = 123
@abc[:x][:y][:z] = 'abc'
@abc
# => {:a=>{}, :b=>{}, :custom=>123, :x=>{:y=>{:z=>"abc"}}}

我相信等效的Python数据结构会是这样的

defaultdict
:

from collections import defaultdict

def x()
  return defaultdict(x)

abc = defaultdict(x)
© www.soinside.com 2019 - 2024. All rights reserved.