2012-03-29 115 views
39

考慮以下數組a如何將參數傳遞給array.map快捷方式?

a = [1, 2, 3, 4, 5] 

我該怎麼做:使用短符號

a.map { |num| num + 1 } 

a.map(&:+ 1) 

或:

a.map(&:+ 2) 

其中1和2是參數?

+16

作弊:'[1,2,3,4,5] .map(&:next)#=> [2,3,4,5,6]' – 2012-03-29 20:59:37

+0

您可能感興趣的Ruby [Enumerators]( http://www.ruby-doc.org/core-2.1.2/Enumerator.html)。 – alxndr 2014-06-10 04:54:09

回答

33

你不能這樣做。 &運算符用於將符號轉換爲特效。

a = [1, 2, 3, 4, 5] 
puts a.map(&:to_s) # prints array of strings 
puts a.map(&:to_s2) # error, no such method `to_s2`. 

&to_proc的縮寫:

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

創建並返回新PROC。如您所見,您無法將任何參數傳遞給此方法。您只能調用生成的proc。

+0

你是對的:因爲array.map(&:some_method)是short的用於:class Symbol def to_proc proc {| obj,* args | obj.send(self,* args)}結束 結束。你如何傳遞*參數? – 2012-03-29 20:15:38

+0

@not_nil:你沒有。使用普通塊/ proc。 – 2012-03-29 20:18:24

+2

@not_nil:Ruby不支持任何超出「Symbol#to_proc」範圍的無點式樣,因爲它缺少函數組合和currying。你來自功能性背景嗎? – 2012-03-29 20:22:04

24

你不能這樣做map。但看看Facets'Enumerable#map_send

require 'facets' 
[1, 2, 3].map_send(:+, 1) 
#=> [2, 3, 4] 

編寫自己的實現是非常簡單的:

module Enumerable 
    def map_send(*args) 
    map { |obj| obj.send(*args) } 
    end 
end 
0

如果您確實需要使用Ampex庫,但我不知道它是否仍然保留。