我在RailsCast中找到了这段代码:
def tag_names
@tag_names || tags.map(&:name).join(' ')
end
Run Code Online (Sandbox Code Playgroud)
什么是(&:name)中map(&:name)意味着什么?
可能重复:
map(&:name)在Ruby中意味着什么?
在Ruby中,我知道如果我这样做:
some_objects.each(&:foo)
Run Code Online (Sandbox Code Playgroud)
它是一样的
some_objects.each { |obj| obj.foo }
Run Code Online (Sandbox Code Playgroud)
也就是说,&:foo创建块{ |obj| obj.foo },将其转换为Proc,并将其传递给每个块.为什么这样做?它只是一个Ruby特例,还是有理由为什么这样做呢?
可能重复:
map(&:name)在Ruby中意味着什么?
我遇到了一个代码片段,其中包含以下内容
a.each_slice(2).map(&:reverse)
Run Code Online (Sandbox Code Playgroud)
我不知道&:运营商的功能.这是如何运作的?
我已经看过好几次,但我无法弄清楚如何使用它们.镐说这些是特殊的快捷方式,但我无法找到语法描述.
我在这样的背景下见过他们:
[1,2,3].inject(:+)
Run Code Online (Sandbox Code Playgroud)
以计算总和为例.
我正在阅读Stackoverflow并偶然发现以下代码
array.map(&:to_i)
Run Code Online (Sandbox Code Playgroud)
好的,很容易看出这段代码的作用,但我想了解更多关于&:我以前从未见过的构造.
不幸的是,我能想到的只是"lambda",而不是.谷歌告诉我Ruby中的lambda语法是->->(x,y){ x * y }
所以&:除了调用单一方法之外,任何人都知道神秘是什么以及它能做什么?
我发现Ruby中的这段代码非常有趣
(1..4).inject(&:+)
Run Code Online (Sandbox Code Playgroud)
好的,我知道是什么inject,我知道这段代码基本上相当于
(1..4).inject(0) {|a,n| a + n}
Run Code Online (Sandbox Code Playgroud)
但它究竟是如何运作的呢?
为什么&:+和写块一样{|a,n| a + n}?
为什么它不需要初始值?我很好,正常值为0,但(1..4).inject(&:*)也有效,初始值必须为1 ...
可能重复:
map(&:name)在Ruby中意味着什么?
我正在看一个railscast并看到了这段代码.
[Category, Product].(&:delete_all)
Run Code Online (Sandbox Code Playgroud)
关于清理数据库.
我询问了IRC中的线路,并被告知
(&:delete_all)
Run Code Online (Sandbox Code Playgroud)
是一个捷径
{|model| model.delete_all}
Run Code Online (Sandbox Code Playgroud)
我用以下测试了这个
class ClassOne
def class_method
puts 1
end
end
class ClassTwo
def class_method
puts 2
end
end
[ClassOne, ClassTwo].each(&:class_method)
Run Code Online (Sandbox Code Playgroud)
我收到一个错误说
Wrong Argument type Symbol (expected Proc)
Run Code Online (Sandbox Code Playgroud)
我也试过了
one = ClassOne.new
two = ClassTwo.new
[one, two].each(&:class_method)
Run Code Online (Sandbox Code Playgroud)
但那仍然失败了.
如果我修改它来阅读
[one, two].each{|model| model.class_method}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.
那么,&:delete_all实际上做了什么?文档说这delete_all是一种方法,所以我对这里发生的事情感到困惑.
可能重复:
Ruby/Ruby on Rails&符号冒号
在Railscast#167中看到:
def tag_names
@tag_names || tags.map(&:name).join(' ')
end
Run Code Online (Sandbox Code Playgroud)
这是什么&:name语法,它做什么?
我理解符号是什么,但是&可以将其他类型的对象添加到其中?
重复问题:Ruby&符号冒号快捷方式
可能重复:
map(&:name)在Ruby中意味着什么?
有什么东西survey.map(&:questions).flatten.compact叫做,所以我可以找到更多关于它们的信息:).这&:解决了什么问题,或者它究竟做了什么?它是否用于其他语言?
例如,
contacts.sort_by(&:first_name).
Run Code Online (Sandbox Code Playgroud)
我理解这是做什么的,但我不明白&:符号,这意味着什么,它是一个符号(:)与块(&)?我在哪里可以阅读更多相关信息?