2012-11-14 238 views
4

可能重复:
What does map(&:name) mean in Ruby?
What do you call the &: operator in Ruby?这是&意味着什么?

只是看一些railscast,看到这样的代码:

[Category, Product, Person].each(&:delete_all) 

我知道,它会清除这些模型中的所有记录,但我找不到这&:delete_all的意思。

+1

这是已经被问和回答了这里在计算器上不低于20个其他问题重复:[了解\ [ClassOne,ClassTwo \] .each \(&:my_method \)](http://StackOverflow.Com/q/99318/),[Ruby中的map(&:name)是什么意思? ](http://StackOverflow.Com/q/1217088/),[Ruby中'&:capitalize'究竟是什么?](http://StackOverflow.Com/q/1792683/),[Ruby/Ruby on Rails &符号冒号捷径](http://StackOverflow.Com/q/1961030/),[Ruby:'&:symbol'语法](http://StackOverflow.Com/q/2096975/),... –

+1

... [这是什么'&:last' Ruby构造调用?](http://StackOverflow.Com/q/2211751/),[你在Ruby中叫什么'&:'操作符?](http://StackOverflow.Com/q/2259775/),[什么是' map(&:name)'在这个Ruby代码中做些什么?](http://StackOverflow.Com/q/2388337/),[在ruby中是什么':+'和'&+?](http:// StackOverflow.Com/q/2697024/),'Post.published.collect(&:views_count)'中的''&:views_count''](http://StackOverflow.Com/q/3888044/),[Ruby Proc语法] (http://StackOverflow.Com/q/4512587/),['(1..4).inject(&:+)'“如何在Ruby中工作](http://StackOverflow.Com/q/ 5003257 /),... –

+1

... [Ruby映射方法语法问题](http://StackOverflow.Com/q/5231919/),[以下语句是什么&&:property'?](http://StackOverflow.Com/ q/5620411 /),[在下面的ruby语法中,'&是什么意思?](http://StackOverflow.Com/q/5952175/),[为什么会在ruby中的属性上使用一元运算符?即'&:first'](http://StackOverflow.Com/q/6289084/),[Array#map'如何具有这样的参数?](http://StackOverflow.Com/q/ 6716629 /),['&:'是什么意思,在红宝石中,是否与符号混合在一起?](http://StackOverflow.Com/q/9188362/),... –

回答

7

它基本上简写本:

[Category, Product, Person].each { |e| e.delete_all } 

也就是说,它发送delete_all给迭代的每个元素。

1

&:delete_all基本上翻译成| obj | obj.delete_all。和号在循环中的当前对象上调用to_proc。

1

当你把一个Proc对象pr&在最后一个参数位置,如:

some_method(&pr) 

然后,对应于pr块将被传递到some_method。如果一个对象non_pr这不是一个Proc给出像:

some_method(&non_pr) 

然后,non_pr将隐含地被to_proc转换为Proc

例如,当non_prSymbol,然后Symbol#to_proc将被应用,这恰好是这样的:

class Symbol 
    def to_proc 
    proc{|obj, *args| obj.send(self, *args)} 
    end 
end 

特别是随着each(&:delete_all),所述:delete_all.to_proc将返回Proc对象:

proc{|obj, *args| obj.delete_all(*args)} 

所以相应的块会被传递到each像这样:

each{|obj, *args| obj.delete_all(*args)} 

我注意到一个块为Enumerable#each的元数是一个,它被简化成:

each{|obj| obj.delete_all}