Амперсанд / оператор с одинарным префиксом &
может использоваться в ровно в двух местах:
- В списке параметров .
- В списке аргументов .
В списке параметров унарный префикс &
ampersand sigil означает «Возьмите переданный блок». в качестве аргумента сверните его в объект Proc
и привяжите его к этому параметру. "
В списке аргументов оператор амперсанда с унарным префиксом &
означает" Взять объект Proc
, который был передан в качестве аргумента, разверните его в блок и передайте в качестве аргумента блока. " Точнее, и это то, что включает «трюки», такие как Symbol#to_proc
, это означает «Возьмите объект Proc
, который был передан в качестве аргумента , или конвертируйте объект, используя to_proc
, если он еще не является * 1030». *, разверните его в блок и передайте в качестве аргумента блока. "
В некотором смысле, они в точности противоположны друг другу.
В вашем первом примере Во втором случае у вас нет ни списка параметров, ни списка аргументов, так что ни &
унарный префикс ampersand sigil, ни оператор &
унарный префикс ampersand не являются синтаксически допустимыми.
Во втором случае второго примера, вы передаете результат :to_s.to_proc
, который является Proc
объектом, в качестве аргумента Range#map
. Однако Range#map
не имеет никаких параметров (кроме неявного параметра блока, который есть у каждого метода в Ruby), поэтому вы передаете один аргумент, где ни один не ожидается. Вы должны развернуть свой аргумент Proc
в блок, подобный следующему:
(0..10).map(&(:to_s.to_proc))
, который можно сократить до
(0..10).map(&:to_s)
, поскольку оператор амперсанда с унарным префиксом &
выполнит преобразование само по себе, если операнд уже не является Proc
объектом.