与Ruby中的“Array#each”混淆

与Ruby中的“Array#each”混淆,ruby,Ruby,与数组#每个混淆如下: %w{ david black }.each {|str| str.capitalize } #=> ["david", "black"] 上面的代码很酷,但下面的逻辑是如何工作的,我无法理解 %w{ david black }.each(&:capitalize) #=> ["david", "black"] 使用地图怎么样 [1173]pry(main)> ["david","black"].map{|str| str.capitaliz

数组#每个
混淆如下:

%w{ david black }.each {|str| str.capitalize }
#=> ["david", "black"]
上面的代码很酷,但下面的逻辑是如何工作的,我无法理解

%w{ david black }.each(&:capitalize)
#=> ["david", "black"]
使用地图怎么样

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

我不明白你的例子。每个,也许你是说。地图


当您传入&:method\u名称时,它是在块中执行此操作的简写。因此,对于每一项应用此方法。

表示法
&:something
对数组中的每个元素都执行方法
something

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

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

这是一个非常古老的技巧,叫做
Symbol\to#u proc

您可以在此处阅读更多信息:

基本上,它是调用不带参数的方法的快捷方式。例如,经常用于
地图

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

你对什么特别感到惊讶?顺便说一句,将
大写
一起使用是毫无意义的。@SergioTulentsev我对
每个(&:capitalize)
的语法感到惊讶。我认为每个ruby学习者都应该阅读这门语言的每一个角落。我做到了,但无法理解下面的代码是如何产生正确的输出的。@SergioTulentsev不确定“将大写字母与.each一起使用”是什么意思。你能解释一下你的意思吗?谢谢。@garbagecollection是的,你是对的,但我想他是想说我为什么编写这样的代码。@garbagecollection:
each
用集合中的每个元素调用一个传递的块,然后返回集合。将忽略块的返回值。这就是为什么它毫无意义。