Ruby 中的运算符优先级和计算顺序:产量与<<(铲子运算符)



我正在读这本书《基础良好的Rubister及其控制流技术》第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]中的运算符优先级或/和求值顺序是什么?

通常,方法参数包含在括号中:

x=foo(y)
a=bar(baz(z))
b=7+baz(w)

在某些情况下(即,如果先例不具有其他约束力(,可以省略大括号。因此,

x = foo y

有效,但是

a = bar baz z

被解释为

a = (bar(baz))(z)

b = 7 + baz w

作为

b = (7+baz) w

如果对表达式的解释产生了有意义的结果,那么这是有风险的。在这种情况下,您甚至不会收到错误消息,但程序的行为方式与您预期的不同。

通常,在调用方法时总是使用括号是个好主意。

最新更新