这样的哈希表和Lambda之间有什么区别?
Lambda和哈希表没有任何共同点。你的问题就像问:
方法和数组之间有什么区别?
只是哈希表可以为不存在的键指定默认值。
h = Hash.new(10)
h["a"] = 2
puts h["a"]
puts h["b"]
--output:--
2
10
哈希表还提供了一种动态指定默认值的方法:您可以提供一个块。以下是一个示例:
h = Hash.new do |h, key|
h[key] = key.length
end
puts h['hello']
puts h['hi']
p h
--output:--
5
2
{"hello"=>5, "hi"=>2}
当您访问不存在的键时,将调用该块,并且该块可以执行任何您想要的操作。因此,有人巧妙地想出了一种方法,可以创建一个哈希并指定计算斐波那契数列的默认值。以下是其工作原理:
h = Hash.new do |h, key|
if key < 2
h[key] = key
else
h[key] = h[key-1] + h[key-2]
end
end
这将创建一个名为h的哈希表,其中不包含任何键或值。如果您接下来写:
puts h[3]
...3 是一个不存在的键,因此块使用参数 h 和 3 被调用。 块中的 else 子句执行,给出:
h[3-1] + h[3-2]
或者:
h[2] + h[1]
但是要评估该语句,Ruby必须首先评估h[2]。 但是当Ruby在哈希中查找h [2]时,键2是一个不存在的键,因此调用块并传递参数h和2,从而得到:
(h[2-1] + h[2-2]) + h[1]
或者:
(h[1] + h[0]) + h[1]
为了评估该语句,Ruby 首先必须评估第一个 h[1],当 Ruby 尝试在哈希表中查找 h[1] 时,1 是一个不存在的键,因此将使用参数 h 和 1 调用块。这次 if 分支执行,导致发生以下情况:
h[1] = 1
并且1作为h [1]的值返回,给你这个:
(1 + h[0]) + h[1]
然后 Ruby 查找 h[0],因为 0 是一个不存在的键,所以调用块并传入参数 h 和 0,if 子句执行并执行以下操作:
h[0] = 0
并且h[0]的值为0,返回如下结果:
(1 + 0) + h[1]
然后 Ruby 在哈希表中查找 h[1],这次键 1 存在,并且它的值为 1,因此你得到:
(1 + 0) + 1
这相当于2,所以h[3]被设置为2。调用h[3]后,您会得到以下输出:
puts h[3]
p h
--output:--
2
{1=>1, 0=>0, 2=>1, 3=>2}
正如您所看到的,之前的计算都被存储在哈希表中,这意味着这些计算不必为其他斐波那契数再次执行。