考慮以下數組a
:如何將參數傳遞給array.map快捷方式?
a = [1, 2, 3, 4, 5]
我該怎麼做:使用短符號
a.map { |num| num + 1 }
:
a.map(&:+ 1)
或:
a.map(&:+ 2)
其中1和2是參數?
考慮以下數組a
:如何將參數傳遞給array.map快捷方式?
a = [1, 2, 3, 4, 5]
我該怎麼做:使用短符號
a.map { |num| num + 1 }
:
a.map(&:+ 1)
或:
a.map(&:+ 2)
其中1和2是參數?
你不能這樣做。 &
運算符用於將符號轉換爲特效。
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。
你是對的:因爲array.map(&:some_method)是short的用於:class Symbol def to_proc proc {| obj,* args | obj.send(self,* args)}結束 結束。你如何傳遞*參數? – 2012-03-29 20:15:38
@not_nil:你沒有。使用普通塊/ proc。 – 2012-03-29 20:18:24
@not_nil:Ruby不支持任何超出「Symbol#to_proc」範圍的無點式樣,因爲它缺少函數組合和currying。你來自功能性背景嗎? – 2012-03-29 20:22:04
你不能這樣做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
在這種情況下,你可以做
a.map(&1.method(:+))
但僅僅因爲1 + X通常是與x + 1相同。
Here is a discussion of this practice in a performance context.
先生,請拿走我所有的錢。謝謝! – iGbanam 2016-07-12 11:29:30
如果您確實需要使用Ampex庫,但我不知道它是否仍然保留。
作弊:'[1,2,3,4,5] .map(&:next)#=> [2,3,4,5,6]' – 2012-03-29 20:59:37
您可能感興趣的Ruby [Enumerators]( http://www.ruby-doc.org/core-2.1.2/Enumerator.html)。 – alxndr 2014-06-10 04:54:09