2012-08-07 186 views
-1

我檢討別人的Ruby代碼,並在其中,他們已經寫了類似於:&:a功能在做什麼?

class Example 
    attr_reader :val 
    def initialize(val) 
    @val = val 
    end 
end 

def trigger 
    puts self.val 
end 

anArray = [Example.new(10), Example.new(21)] 
anArray.each(&:trigger) 

:trigger意味着符號取和&將其轉換爲proc

如果這是正確的,除了使用self.之外,是否有任何方法將變量傳遞到觸發器?

這是有關,但從來沒有回答:http://www.ruby-forum.com/topic/198284#863450

+1

相關的問題:HTTP://計算器。 com/questions/1217088/what-do-mapname-mean-in-ruby – 2012-08-07 23:34:58

+0

謝謝@AndrewGrimm,它爲它增加了更多的深度。 – AJP 2012-08-07 23:47:23

+0

也相關:http://stackoverflow.com/questions/23695653/can-you-supply-arguments-to-the-mapmethod-syntax-in-ruby – 2014-06-03 09:18:00

回答

2

是有傳遞變量到觸發任何方式

你調用Symbol#to_proc不允許你指定的任何參數。這是Ruby提供的一種方便的特殊功能,它專門爲調用沒有參數的方法提供。

如果你想爭論,你必須使用完整的塊語法:

anArray.each do |i| 
    i.trigger(arguments...) 
end 
+0

我無法在文檔中找到這個,你是如何學習這個/我可以自己學習的?謝謝。 – AJP 2012-08-07 23:21:56

+0

Google「symbol to_proc」。第二個鏈接是[文檔](http://www.ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc)。 – meagar 2012-08-07 23:51:42

+0

不錯,我只是試着'&:',因此沒有找到任何東西,包括那個文檔中的'(&:to_s)'。 – AJP 2012-08-08 13:54:53

2

Symbol#to_proc是調用方法不帶參數的快捷方式。如果您需要傳遞參數,請使用完整表單。

[100, 200, 300].map(&:to_s) # => ["100", "200", "300"] 
[100, 200, 300].map {|i| i.to_s(16) } # => ["64", "c8", "12c"] 
0

這將不正是你所需要的:

def trigger(ex) 
    puts ex.val 
end 

anArray = [Example.new(10), Example.new(21)] 
anArray.each(&method(:trigger)) 
# 10 
# 21