【问题标题】:Lua: colon and dot function invocation acting differentlyLua:冒号和点函数调用行为不同
【发布时间】:2018-10-13 08:51:53
【问题描述】:

我最初在 LOVE2D 中开发我的游戏时遇到了这个问题,但我不知道为什么。
据我所知,x:foo() 只是x.foo(self) 的语法糖,但将其与其他类结合会导致一些奇怪的行为。
基本上,我有两个程序

y = {}

function y:bar()
    return self.b
end

x = {}

function x:foo()
    return y.bar(self)
end

print(x.foo({b = 3}))

这会按预期打印3

y = {}

function y:bar()
    return self.b
end

x = {}

function x:foo()
    return y:bar()
end

print(x.foo({b = 3}))

但这会打印nil !!
我不明白,为什么这两个程序打印不同的东西?

【问题讨论】:

  • y:bar() 与y.bar(y) 相同

标签: lua


【解决方案1】:

x:foo() 是x.foo(x) 的语法糖

这意味着

function x:foo()
    return y:bar()
end

其实是

function x:foo()
    return y.bar(y)
end

【讨论】:

    【解决方案2】:

    再看看你对self的使用

    function x:foo()
        return y.bar(self) -- = y.bar(x)
    end
    
    function x:foo()
        return y:bar() -- = y.bar(y)
    end
    

    【讨论】:

      【解决方案3】:

      x:foo() 只是x.foo(self) 的语法糖

      这在函数定义的上下文中是正确的,但不是作为表达式。

      function x.y.z:foo(a, b)
          print(self, a, b)
      end
      

      与

      相同
      function x.y.z.foo(self, a, b)
          print(self, a, b)
      end
      

      将function definition 设置到表字段中可以是一种方法,即带有:。对于方法和非方法,也允许嵌套表字段,前提是键是有效 Lua 标识符的字符串,如 x.y.z。

      但是

      print(x.y().z:foo(a, b))
      

      与

      相同
      local _ = x.y().z
      print(_.foo(_, a, b))
      

      对于method call syntax,: 的左侧是一个只计算一次的表达式 (x.y().z)。

      【讨论】:

        猜你喜欢
        • 2015-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 2016-03-03
        • 2021-05-18
        • 1970-01-01
        相关资源
        最近更新 更多