【发布时间】:2021-04-16 00:44:21
【问题描述】:
我正在阅读这本书 Well-Grounded Rubyist,其第 184 页的控制流技术章节有一个使用迭代器实现映射的简单示例:
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])我不确定确切原因,但有时需要括号来消除参数歧义 -
仅供参考,
acc << foo bar出现相同的语法错误 - 它并非特定于yield。 -
“据我了解,问题出在运算符优先级或评估顺序上。” – 这不可能是评估顺序的问题,因为你得到了一个
SyntaxError,因此没有任何东西可能以错误的顺序被评估,因为根本没有任何东西被评估。
标签: ruby iterator operator-precedence yield order-of-execution