2015-12-23 2 views
0

Я узнаю об использовании символов в Ruby и понял, что они действуют в основном как ссылки на переменные, ключи в хэш-таблицах и даже как способ отправки блоков в методы.Использование символов для ссылок в Ruby, например. : +,: -,: *

Мои вопросы: что такое символы, такие как :+:-:*, ссылаясь, когда я использую их в методе?

например. используя :+ просуммировать все значения в массиве:

puts [1,2,3].reduce(:+) 
=> 6 

дает тот же результат, как:

puts [1,2,3].reduce {|sum, i| sum += i} 
=> 6 

и если я создаю свою собственную версию: +

a = lambda {|sum,i| sum += i} 
puts [1,2,3].reduce(&a) 
=> 6 

Мой первый мысль есть поэтому :+ ссылки {|sum, i| sum += i} как явный блок, но у меня были проблемы с поиском информации, чтобы подтвердить это.

+0

информация здесь: http://stackoverflow.com/questions/4014190/passing-an-operator-to-a-function –

+0

Спасибо за ссылки! –

ответ

4

Символ, который вы передаете reduce, будет интерпретироваться как имя метода вызова для каждого элемента. Так что

collection.reduce(:foo) 

равносильна этому

collection.reduce { |memo, element| memo.foo(element) } 

Причина она работает с суммами, что + оператор на самом деле просто метод по номерам.

1.+(3) # => 4 

Моя первая мысль, что таким образом: + ссылки {| сумма, я | sum + = i} как явный блок

Не уверен, что вы имеете в виду, но :+, безусловно, не ссылается на этот блок. Или любой блок. Или что-нибудь.

Символы - это просто имена. Они ничего не указывают. Решать, что они означают, зависит от кода, который их использует.

+0

Aha! Итак, в моем примере .reduce принимает символ: + и связывает его одним из своих методов? Благодарю за ваш ответ! –

+0

Да, метод '+' будет вызываться для каждого элемента сокращаемой коллекции. В этом случае элементы - это числа, которые на самом деле имеют такой метод.Это не сработает, скажем, с книгами. –

4

Символ не является ссылкой на переменные, ключи в хэш-таблицах или как способ отправки блоков по вашему требованию. Истина заключается в том, что для описания этих вещей используется символ, разработанный человеком, который написал соответствующий метод, который их использует, и фактическое сопоставление символа с этими вещами выполняется в рамках соответствующего метода.

Для вашего примера, :+ не ссылается на {|sum, i| sum += i} или любой другой блок; это особенность альтернативного синтаксиса reduce, который позволяет передавать символ и преобразует этот символ в блок. Соответствующий блок, хотя и близко к нему, это не то, что вы думали, но есть: {|sum, i| sum + i}.

+1

Спасибо! Теперь он становится яснее. –

Смежные вопросы