我想从块内访问枚举器的大小,如下所示:
["cat", "dog", "mouse"].each_with_index { |e, i| puts "#{i + 1} of #{x.size}: #{e}" }
Run Code Online (Sandbox Code Playgroud)
其中 x 是运行each_with_index 的数组。
我尝试了点击方法,但这并没有像我想象的那样起作用。
例如,这段代码看起来不错,我猜:
["cat", "dog", "mouse"].tap { |a| a.each_with_index { |e, i| puts "#{i + 1} of #{a.size}: #{e}" }} # Works, but why do I need two blocks?
Run Code Online (Sandbox Code Playgroud)
我希望只使用一个块而不是两个块来完成此操作。像这样:
["cat", "dog", "mouse"].each_with_index.tap { |a, e, i| puts "#{i + 1} of #{a.size}" } # Does not work
Run Code Online (Sandbox Code Playgroud)
这是因为在调用each_with_index 时,您可以使用给定的两个参数(在本例中为项目及其索引)在块内工作。
通常,您可以单独存储数组,然后从块中引用它:
animals = ["cat", "dog", "mouse"]
animals.each_with_index { |e, i| puts "#{i + 1} of #{animals.size}: #{e}" }
Run Code Online (Sandbox Code Playgroud)
它可以用两行代码和一个块来工作,但是您将无法从块内仅引用您的动物数组。
因此,您尝试使用 Tap 似乎是更准确的想法。当 tap 将 self 交给块时,这就是您想要的,然后返回 self,您就可以在块内执行操作,因为您不需要执行任何其他操作。
["cat", "dog", "mouse"].tap do |a|
a.each_with_index do |e, i|
puts "#{i + 1} of #{a.size}: #{e}"
end
end
Run Code Online (Sandbox Code Playgroud)
但为此,您确实需要两个块,一个用于访问 self( ["cat", "dog", "mouse"]),另一个用于使用each_with_indexon self。