2012-10-10 25 views
1
a = (1..10).to_a 
a.map(&:even?) 
=> [false, true, false, true, false, true, false, true, false, true] 

如何使用保存方法名稱的字符串調用map?如何使用字符串代替`Symbol#to_proc`的符號速記

foo = 'even?' 
a.map(...foo...) 
+0

你的意思是速記被稱爲「餅乾冒號」 :) –

+0

@sawa你編輯了這麼多,現在提供的答案,甚至沒有接近什麼OP最初問。 – Kyle

+0

@Kyle Yours和Sergio是有道理的。事實上,當我第一次閱讀它時,我錯誤地認爲這個問題,並且你的回答讓我知道實際提出的問題。然後我編輯它以清楚地說明。 OP將它稱爲「符號冒號」是錯誤的,但這並不重要。問題是關於在這個結構中使用字符串「foo」。 – sawa

回答

2

的簡寫語法不AMPERSAND結腸,它與符號後跟一個符號:

(1..10).map(& :even?) 

在Ruby方法通常是通過符號來表示,因此,如果你在你的變量這有一個符號語法按預期工作:

name = :even? 
(1..10).map(&name) 

如果您無法控制變量方法名稱,例如這是一個論點,我會建議使用一般方法send來代替。它適用於兩個符號&字符串。

def perform enum, name 
    enum.each{ |e| e.send(name) } 
end 

perform 1..10, "even?" 
+0

由於問題編輯,我的答案變得令人困惑,原來的問題是「如何使用紅寶石速記(&&&&&& amp;& amp;& amp;&變量持有方法名稱?」 –

+0

您的回答是非常有益和教育。 –

4
foo = 'even?' 
[1,2,3,4,5].map(&foo.to_sym) 
=> [false, true, false, true, false] 
+2

我會刪除IRB的視覺噪音。沒用的。 –

+1

我不會說它沒用。它提供了ruby版本,並且也證明了示例工程。太多次的評論,比如「它對我不起作用」,使評論部分氾濫,並提供更多的噪音。 – Kyle

+2

是的,它提供了Ruby版本,但就是這樣。作爲回報,它無法複製/粘貼/運行代碼。在我看來,這是不值得的:) –

1

一種替代,它使用 「全形式」 塊和更通用。

a = (1..10).to_a 
name = 'even?' 
a.map{|b| b.send name} # => [false, true, false, true, false, true, false, true, false, true]