【问题标题】:Weird behavior of syntax sugar(colon) in LuaLua中语法糖(冒号)的奇怪行为
【发布时间】:2016-03-03 11:58:39
【问题描述】:
function string.test(s)
    print('test')
end

a = 'bar'
string.test(a)
a:test()

在下一个示例之前一切都很好。

function table.test(s)
    print('test')
end

b = {1,2,3}
table.test(b)
b:test() -- error

为什么会出现此错误?
它在字符串上运行良好。

【问题讨论】:

标签: function lua lua-table syntactic-sugar


【解决方案1】:

默认情况下,表没有像字符串那样的元表。

试试吧:

function table.test(s)
    print('test')
end

b = setmetatable({1,2,3}, {__index=table})
table.test(b)
b:test() -- error

【讨论】:

    【解决方案2】:

    虽然 daurn 很好地回答了您的问题,但请允许 be 解释这是为什么。

    在 Lua 中,所有数据类型都可以有一个元表。 (尽管在处理数字、布尔值等时有很大不同。请参阅 debug.setmetatable。)这包括字符串。默认情况下,这设置为使用 __index 索引字符串库,这是在使语法糖像 print(s:sub(1,5))(s 是字符串)成为可能的时候。

    这与表格不同。默认情况下,表没有元表。您必须使用 setmetatable 手动设置它。

    结束我的回答,享受这段代码 sn-p

    debug.setmetatable(0,{__index=math})
    debug.setmetatable(function()end,{__index=coroutine})
    debug.setmetatable(coroutine.create(function()end), {__index=coroutine})
    local function Tab(tab)
        return setmetatable(tab,{__index=table})
    end
    

    这基本上允许您对数字使用数学函数

    local x = 5.7
    print(x:floor())
    

    并使用协程函数对函数和线程做类似的事情:

    print:create():resume()
    

    如果你问我,那就太难了

    当然,创建表格并在其上使用表格函数:

    local x = Tab{1,2,3,4}
    x:insert(5)
    x:remove(1)
    print(x:concat(", "))
    

    我发现很难想象有人不喜欢这样的酷把戏。

    【讨论】:

    • 我复制粘贴了您的代码,但由于某种原因,我收到错误“尝试索引本地 'x'(数字值)”我在 Windows 7 上使用 Lua 5.1.4。
    • 我怀疑它在 Lua 5.2 中是否有效。应该是debug.setmetatable(0, { __index=math })。 (这也适用于 Lua 5.1。)
    • @siffiejoe 原来如此。谢谢,我不知道我是如何粘贴错误的代码的。我责怪 iOS!
    • @Parki 已修复。
    • @warspyking 是否可以像在“Tab”函数中一样默认为每个表设置一个元表?
    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多