与Ruby中的“Array#each”混淆

时间:2013-03-25 17:31:23

标签: ruby

Array#each混淆如下:

%w{ david black }.each {|str| str.capitalize }
#=> ["david", "black"]

以上代码很酷,但下面的逻辑如何工作,无法理解。

%w{ david black }.each(&:capitalize)
#=> ["david", "black"]

4 个答案:

答案 0 :(得分:3)

这是一个非常古老的技巧,名为Symbol#to_proc

您可以在此处详细了解:http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html

基本上,它是调用不带args的方法的捷径。例如,经常在map中使用。

%w[i can measure length of strings].map(&:length) # => [1, 3, 7, 6, 2, 7]

答案 1 :(得分:0)

如何使用地图?

[1173]pry(main)> ["david","black"].map{|str| str.capitalize }
=> ["David","Black"]
[1173]pry(main)>

答案 2 :(得分:0)

&:something的符号对方法something的数组的每个元素都有效。

这通常与map一起用于更改数组的每个条目或从哈希中提取数据。

[{:foo => :bar, :meh => :bar2}, {:foo => :one, :meh => :two}].map(&:foo)
=> [:bar, :one]

答案 3 :(得分:-1)

我没有得到.each的例子,也许你的意思是.map

当您传入&:method_name时,它是在块中执行此操作的简写。因此,对于每个项目都应用此方法。