oop - 关于何时使用lua冒号语法的问题

标签 oop syntax lua coronasdk

local Public = {}

function Public.new(ent)
  local State = {}


  function State:update(player)
    ent:setLinearVelocity(0,0)
  end

  function State:start(player)
    ent.fixedRotation = true
    self.attackTimer = _G.m.addTimer(200, function()
      ent:setState('attacking', player)
    end)
  end

  function State:exit(player)
    ent.fixedRotation = false
    timer.cancel(self.attackTimer)
  end

  return State
end

return Public

我正在使用 linter,它提示我在 updateexit 方法中不必要地使用了冒号。我这样做的原因是为了保持所有方法的统一。有时我需要self,有时则不需要。

但总的来说,在这些上使用冒号有什么好处吗?似乎如果我有类似 State:start 的东西,那么我可以直接引用 State 。我可以做 State.attackTimerself.attackTimer..

为什么你真的需要冒号?如果您有权访问保存该方法的表,那么您就可以访问 self.. 对吗?

最佳答案

:当您使用表和元表创建类时,语法是一个很好的工具。

上面的代码不是创建一个类,而是创建一组封装的函数。可以访问 State作为升值。

我将使用 Lua Users - SimpleLuaClasses 中的此类举个例子:

Account = {}
Account.__index = Account

function Account:create(balance)
   local acnt = {}             -- our new object
   setmetatable(acnt,Account)  -- make Account handle lookup
   acnt.balance = balance      -- initialize our object
   return acnt
end

function Account:withdraw(amount)
   self.balance = self.balance - amount
end

-- create and use an Account
acc = Account:create(1000)
acc:withdraw(100)

这里我们有一个 acc 的实例( Account )类(class)。调整或修改Account此特定实例中的值我们无法引用Account.balance Account:withdraw里面。我们需要对存储数据的表的引用,即使用 : 传递该表的位置。进来。

acc:withdraw(100)只是 acc.withdraw(acc, 100) 的语法糖传入我们的表作为第一个参数 self 。当您定义Account:withdraw(amount)时有一个隐含的第一个变量 self定义可以写成Account.withdraw(self, amount)

关于oop - 关于何时使用lua冒号语法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57778966/

相关文章:

dictionary - 如何在 nginx 中创建异步 "cron like"调度器

Python 实例变量显然共享数据

java - 如何删除具有相同对象名称的JavaFx标签

javascript - 我是否总是必须将 "this"(或 "that")范围应用于 JavaScript 中的所有对象属性?

java - 我的 java 程序的 SQL 语法错误

lua - 使用 string.format 将字符串值转换为长数字,遇到一个奇怪的问题

python - 为什么 python 允许为同一个类创建不同的属性集?

c++ - ":"(一个冒号)在 "Klass:method(p)"中是什么意思?

assembly - FLAGS/EFLAGS 是 clobber 列表的 "CC"(条件控制)的一部分吗?

lua - Lua中的Wireshark解剖器