在ruby 1.8.7
为什么这样可以:
string += method "value"
但这会引发语法错误:
string << method "remove reviewer"
在较新版本的ruby中是否存在相同的行为?
答案 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'