我已经读过Ruby中的tap,但我对下面的代码块感到困惑,
{}.tap do |h|
# some hash processing
end
任何帮助将不胜感激。
答案 0 :(得分:17)
#tap
方法只是将调用它的对象传递给一个块。在块的末尾,它再次返回相同的对象。这样,您可以链接操作或限制变量范围。
{}.tap { |h| h[:a] = 1 }.size # => 1
您可以将下一个方法链接到此块。并且还避免在您的范围内创建h
变量。
答案 1 :(得分:8)
tap
是特别有用的,如果你想对哈希做一些修改,然后返回它,例如在返回哈希的方法中。 tap
的优势在于,您不必在结尾处公开地返回哈希,并且不需要中间变量。
hash = {}
hash[:a] = 'b'
hash
# => {:a=>"b"}
VS
{}.tap do |hash|
hash[:a] = 'b'
end
# => {:a=>"b"}
答案 2 :(得分:4)
例如:你想链接删除和每个哈希。
你做不到
hash.delete(:key).each {...}
但可以做到
hash.tap { |h| h.delete(:key) }.each { ... }
这是一种链接方法的好方法。
答案 3 :(得分:2)
tap
并没有做任何事情。无论您对块中的h
做什么,都是对原始{}
所做的任何操作。