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...)
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...)
的簡寫語法不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?"
由於問題編輯,我的答案變得令人困惑,原來的問題是「如何使用紅寶石速記(&&&&&& amp;& amp;& amp;&變量持有方法名稱?」 –
您的回答是非常有益和教育。 –
foo = 'even?'
[1,2,3,4,5].map(&foo.to_sym)
=> [false, true, false, true, false]
我會刪除IRB的視覺噪音。沒用的。 –
我不會說它沒用。它提供了ruby版本,並且也證明了示例工程。太多次的評論,比如「它對我不起作用」,使評論部分氾濫,並提供更多的噪音。 – Kyle
是的,它提供了Ruby版本,但就是這樣。作爲回報,它無法複製/粘貼/運行代碼。在我看來,這是不值得的:) –
一種替代,它使用 「全形式」 塊和更通用。
a = (1..10).to_a
name = 'even?'
a.map{|b| b.send name} # => [false, true, false, true, false, true, false, true, false, true]
你的意思是速記被稱爲「餅乾冒號」 :) –
@sawa你編輯了這麼多,現在提供的答案,甚至沒有接近什麼OP最初問。 – Kyle
@Kyle Yours和Sergio是有道理的。事實上,當我第一次閱讀它時,我錯誤地認爲這個問題,並且你的回答讓我知道實際提出的問題。然後我編輯它以清楚地說明。 OP將它稱爲「符號冒號」是錯誤的,但這並不重要。問題是關於在這個結構中使用字符串「foo」。 – sawa