什么ruby tap方法对{}的影响

Sub*_*ash 9 ruby tap

我已经读过Ruby中的tap,但我对下面的代码块感到困惑,

{}.tap do |h|
  # some hash processing
end
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Nik*_*nov 18

#tap方法只是将调用它的对象传递给一个块.在块的末尾,它再次返回相同的对象.这样,您可以链接操作或限制变量范围.

{}.tap { |h| h[:a] = 1 }.size # => 1
Run Code Online (Sandbox Code Playgroud)

您可以将下一个方法链接到此块.并且还避免h在您的范围中创建变量.

  • 请注意,`symbolize_keys`只能通过Rails获得,而不能在常规Ruby中使用.在你的例子中似乎也没有必要,所以如果你想要一个符号键,或许只需将它重写为`h [:a] = 1`. (2认同)

kof*_*rei 10

tap如果你想对哈希做一些修改并在返回哈希之后,例如在返回哈希的方法中,则特别有用.tap这样做的好处是,您不必在末尾以简洁的方式返回哈希,并且不需要中间变量.

hash = {}
hash[:a] = 'b'
hash
# => {:a=>"b"}
Run Code Online (Sandbox Code Playgroud)

{}.tap do |hash|
  hash[:a] = 'b'
end
# => {:a=>"b"}
Run Code Online (Sandbox Code Playgroud)


Art*_*hur 5

例如:您想将delete链接起来,每个链接都放在一个哈希表上。

你做不到

hash.delete(:key).each {...}
Run Code Online (Sandbox Code Playgroud)

但是可以做

hash.tap { |h| h.delete(:key) }.each { ... }
Run Code Online (Sandbox Code Playgroud)

这是链接方法的好方法。