使用<<时的语法错误但不是在使用+ =时

时间:2015-09-27 05:23:47

标签: ruby syntax syntax-error

ruby 1.8.7

为什么这样可以:

string += method "value"

但这会引发语法错误:

string << method "remove reviewer"

在较新版本的ruby中是否存在相同的行为?

2 个答案:

答案 0 :(得分:1)

是的,在更高版本的Ruby中也有相同的行为。 (我在Ruby 2.2上测试过。)

这是因为Ruby的operator precedence

要解决此问题,您可以在<<

的情况下使用括号
string << method("remove reviewer")

然后,它应该工作,不会得到语法错误。

或者,为了使其一致,您可以对它们使用括号:

string += method("value")
string << method("remove reviewer")

事实上,强烈建议您使用括号()进行方法调用,以避免出现类似您所询问的情况。检查this post以获取更多信息

答案 1 :(得分:1)

您可以使用<< =+string += (method "value") 以及方法调用的Operator Precedence来解释此行为。

Ruby将您的第一个示例读作:

(string << method) "remove reviewer"

但第二个是:

string += method("value")
string << method("remove reviewer")

IMO最好使用parenthesize进行方法调用,即使Ruby在许多情况下不需要它们也是如此。这使得代码更具可读性并且更不容易出错:

'/root/work/FirstPeak3', '/root/.local/lib/python2.7/site-packages/nupic-0.2.4.dev0-py2.7-linux-x86_64.egg', '/usr/lib/python2.7/dist-packages', '/usr/local/lib/python2.7/dist-packages/nupic-0.2.4.dev0-py2.7-linux-x86_64.egg', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/root/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/root/Applications/numenta_src', '/root/Applications/numenta_src/nupic', '/root/Applications/numenta_src/nupic/data'