2012-11-14 237 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}