原文链接:http://blog.csdn.net/zhangxaochen/article/details/8094929
很简单的代码:
('hello'):sub(1, 2) ('hello'):sub(1, 2)
整个文件只有这样两行。 看起来挺正常, 猜猜运行会怎样?结果是, 执行会出错!错误信息:
ambiguous syntax (function call x new statement) near '('
WTF! 我们本来用 ('hello') 期望构造一个string 对象, 但是第二行的 ('hello') 却被解析成了接着第一行的函数调用。
怎么办呢? 其实很简单, 在第一句后面加一个分号或者逗号就行了。
如果你把两句写在一行, 错误原因就更明显了:
('hello'):sub(1, 2) ('hello'):sub(1, 2)
两个语句之间只有一个空格, 没有分号或者逗号。
因为lua本身语句之间是允许只用空格分隔的,上面的代码看起来似乎没错。但是实际运行报错:
attempt to call a string value
也就是说, lua 解析器是这样看待这两条语句:
x=('hello'):sub(1, 2); x('hello'):sub(1, 2)
因为 lua 里函数也是“第一类变量”, 本身允许这样的 obj(xxx) 这样的语句存在, 比如:
local obj=function(a) print(a) end obj('hello')
所以, “x=('hello'):sub(1, 2); x('hello'):sub(1, 2)” 这样的解析也是情理之中。 可是 x 作为一个string对象, 当然 x('hello') 就要报错了。
类似的代码:
print('hi') ('hello'):sub(1, 2)
想想 print什么都不返回应该不会出错啊。可是就是什么都不返回也会报错:
attempt to call a nil value
解析器认为 print 返回的nil, 然后后面成了调用 nil('hello'):sub(1, 2)。。囧
唯一的解决办法, 就是尽量不要这样写代码, 不要使用 匿名string 这样的构造方式
原文链接:http://blog.csdn.net/zhangxaochen/article/details/8094929
{{OVER}}