2014-12-15 2 views
0

Я учусь рубин в течение 2 недель, но у меня есть проблема, которую вы, вероятно, теперь, когдаРубиновые символы на # прок с пут

words = ["hello", "world", "test"] 
words.map do |word| 
    word.upcase 
end 

равно

words = ["hello", "world", "test"] 
words.map(&:upcase) 

но почему это

m = method(:puts) 
words.map(&m) 

работа ??

ответ

2

Object#method получает объект Method от данного символа. method(:puts) получает Method объект, соответствующий Kernel#puts.

Унарный & оператор называет to_proc под капотом:

method(:puts).respond_to?(:to_proc) # => true 

to_proc в Method возвращающего Proc эквивалентно { |x| method_name(x) }:

[1, 2, 3].map &method(:String) # => ["1", "2", "3"] 
[1, 2, 3].map { |x| String(x) } # => ["1", "2", "3"] 
+0

Спасибо за ваш ответ, но когда я делаю это ----> слова = [ "Hello", "мир", "тест"] words.map (&: Upcase) proc не {| x | method_name (x)}, но {| x | x.method_name()} нет? это автоматически меняется? – unoomad

+0

@unoomad Да, вы правы. Но это не совсем «автоматический», на самом деле он вызывает ['to_proc'] (http://www.ruby-doc.org/core-2.1.5/Symbol.html#method-i-to_proc) в« Символ ». – August

+0

Хорошо, я понимаю, спасибо. – unoomad

1

Вы используете Object#method тянуть метод от ядра и сохраните его в переменной «m».

& звонок оператора Method#to_proc. Констатируя все это явно:

irb(main):009:0> m = Kernel.method(:puts); ["hello", "world", "test"].map{|word| m.to_proc.call(word)} 
hello 
world 
test 
=> [nil, nil, nil] 
Смежные вопросы