Я читаю эту книгу Обоснованный рубист и его глава «Техники управления потоком» на стр. 184 содержит простой пример реализации map с помощью итератора:
class Array
def my_map
c=0
acc = []
until c == size
acc << yield self[c]
c += 1 end
acc
end
end
У меня есть следующая ошибка при запуске этого кода ruby MY_FILE.rb
:
MY_FILE.rb:6: syntax error, unexpected `self', expecting `end'
acc << yield self[c]
Решение этой проблемы заключается в заключении скобок вокруг yield self[c]
, чтобы вся эта строка выглядела так:
acc << (yield self[c])
Затем процедура работает с этим однострочным изменением. В моем понимании проблема либо с приоритетом оператора, либо с порядком оценки. Я довольно долго бродил по сети, но не мог точно определить, почему именно код из книги не работает.
Почему пример книги не работает? Каков приоритет оператора и/или порядок оценки в acc << yield self[c]
?
acc << yield(self[c])
Я не уверен в точной причине, но скобки иногда требуются для устранения неоднозначности аргументов. - person max pleaner   schedule 11.01.2021acc << foo bar
— это не относится кyield
. - person Stefan   schedule 11.01.2021SyntaxError
, и, следовательно, ничто не может быть оценено в неправильном порядке, поскольку вообще ничего не оценивается. - person Jörg W Mittag   schedule 11.01.2021