2014-11-03 18 views
2

我經常寫:Ruby中的隱式產量呢?

some_array.each { |array_element| array_element.some_method(args) }

爲什麼不能有一個選項,一個隱含的收益率,所以你可以寫例如:

some_array.each { _.some_method(args) }

我不知道什麼字符_實際上應該是,我想它只能用在最多的樣板設置中,在那裏你正在處理一維數組,並且試圖連續地將每個項目放到塊中。這將節省大量的重複輸入。

+0

有趣的想法。這個實現將是一個問題,但這是一個細節:'A類; def a;放'嗨';結束;結束','_ = A.new',_.a#=> hi'。 – 2014-11-03 07:15:33

回答

2

您是否熟悉方法調用的#to_proc&語法?它們涵蓋了一些與您在此展示的相似的情況。例如:

[1, -2, -4].map(&:abs) => [1, 2, 4] 

&用來傳遞一個對象以代替塊的。如果對象不是Proc,則在它用於代替塊之前,會自動調用#to_proc以獲得ProcSymbol#to_proc返回一個Proc,其行爲如下:{ |obj, *args| obj.symbol_name(*args) }

在您的示例中,您使用的是args,它們大概是從周圍的詞彙環境中捕獲的。 Symbol#to_proc不會幫助你。但要做出新的構建方法並不難。例如:

class Symbol 
    def with_args(*args) 
    Proc.new { |x| x.send(self, *args) } 
    end 
end 

然後,你可以這樣做:

some_array.each(&:some_method.with_args(args)) 

不管是不是明確的塊是給你任何好轉。無論如何,這是一種你應該知道的技巧。