【问题标题】:Why lua's syntax sugar not work here(call function with colon)?为什么 lua 的语法糖在这里不起作用(用冒号调用函数)?
【发布时间】:2017-04-27 04:34:16
【问题描述】:

我知道一些关于在 lua 中调用函数语法糖的知识。

A = {}
function A.func(a) print(tostring(a))end

我在上面有一张桌子 A。我可以像这样调用 A.func A.func(A) ,我也可以这样打电话A:func()

但是当我将 A 和 A.func 保存在表 B 中,然后尝试回调。发生错误,即“尝试调用零值(方法'v')

B = {}
B[A] = A.func

--call A.func
k,v = next(B)
k:v()--error happened here
v(k)--no error occurred

所以,我只是想知道当我使用语法糖时这里发生了什么?

【问题讨论】:

    标签: lua syntactic-sugar


    【解决方案1】:

    语法糖使这些命令等效

    > A["func"](A)
    table: 009F7E58
    > A.func(A)
    table: 009F7E58
    > A:func()
    table: 009F7E58
    

    因此,如果尝试执行命令 k:v(),它与 ​​k["v"](k) 相同。但是你的表 k 没有记录“v”,它有记录“func”。这样你就可以运行了

    > k["func"](k)
    table: 009F7E58
    

    > v(k)
    table: 009F7E58
    

    > k:func()
    table: 009F7E58
    

    如您所见,变量“v”包含函数本身,而不是表 k 中的函数名称。但是如果要使用语法糖,则需要知道表中带有函数的记录的名称。

    附:是的,在您的示例中,“k”和“A”是同一个表的名称(009F7E58)。

    【讨论】:

      【解决方案2】:

      当您使用 k:v() v 时,不会引用上面的局部变量 vk:v() 语法告诉 lua 在对象 k 中找到名为 v 的函数并执行它,将 k 作为第一个参数传递。

      另一个例子可能更好地展示了这种行为:

      k = {}
      function k.v(a) print(tostring(a))end
      local function v(a) print("local func called", a) end
      k:v() -- this method always call k.v function 
            -- no matter that variable with same name exists
      

      【讨论】:

        猜你喜欢
        • 2016-03-03
        • 2016-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多