lua类

本文探讨了Lua语言中冒号(:)与点(.)在类方法定义与调用时的不同之处,通过一个简单的Account类实例,展示了如何使用冒号正确地引用self变量,并解释了在何种情况下使用点会引发错误。
Account = {
  balance=123,
}

function Account:f()
	print(self.balance)
end

<pre name="code" class="plain">Account:f()
Account.balance=321print(Account.balance)

输出为 -->123  -->321


上面是一个简单的Account类,需要注意的事Accout类中f 函数是采用的 冒号 : 连接的

并且在f 函数中使用到了隐藏的self变量

如果调用Accout的f 函数 采用 点. 会报错

Account.f()

会报错

 attempt to index local 'self' (a nil value)

另外如果在定义Accout类的f 函数的时候 采用的是 点. 也会报同样的错

如果Accout类的 f  函数没有对self的引用 则  点 . 和 冒号 : 都是OK的

这说明了:若定义lua 类函数时 采用的事 冒号:才能使用self

### 方法的实现原理 Lua 语言本身并没有“对象”的概念,但可以通过 `table` 元表(metatable)机制来模拟的行为。方法的实现依赖于元表中的 `__index` 元方法,该方法用于在访问表中不存在的键时提供查找路径。通过将方法定义在元表的 `__index` 字段中,可以实现方法的共享机制,使得所有实例都能访问到相同的方法。 ```lua local Person = {} Person.__index = Person function Person:new(name) local instance = setmetatable({}, self) instance.name = name return instance end function Person:sayHello() print("Hello, " .. self.name) end local p = Person:new("Alice") p:sayHello() -- 输出 Hello, Alice ``` 在上述示例中,`Person` 是一个表,通过将其自身设置为元表的 `__index` 值,使得所有实例在访问未定义的字段或方法时会查找 `Person` 表中的内容。`new` 方法用于创建新的实例,并设置其元表为 `Person`,从而实现与实例的关系。 ### 静态方法的实现 静态方法不属于的实例,而是直接定义在表上。静态方法的调用不依赖于实例,而是通过本身调用。这种方式常用于实现与相关但不涉及实例状态的功能。 ```lua function Person.createDefault() return Person:new("Unknown") end local defaultPerson = Person:createDefault() defaultPerson:sayHello() -- 输出 Hello, Unknown ``` 上述 `createDefault` 方法即为静态方法,它不依赖于具体的实例,而是通过名 `Person` 调用。 ### 继承与方法重写 通过设置子的元表,并将子的 `__index` 指向父,可以实现继承机制。子可以重写父的方法,或者通过 `super` 机制调用父方法。 ```lua local Student = {} Student.__index = Student setmetatable(Student, Person) function Student:new(name, school) local instance = Person.new(self, name) instance.school = school return instance end function Student:sayHello() print("Student: " .. self.name .. " from " .. self.school) end local s = Student:new("Bob", "MIT") s:sayHello() -- 输出 Student: Bob from MIT ``` 在此示例中,`Student` 继承自 `Person` ,并重写了 `sayHello` 方法。通过 `setmetatable(Student, Person)` 设置元表,使得 `Student` 可以访问 `Person` 的静态方法属性。 ### 动态扩展方法 由于 Lua 的 `table` 是引用型,可以在运行时动态地为添加方法。通过修改表中的方法定义,所有实例都会共享这些新增的方法。 ```lua function Person:sayGoodbye() print("Goodbye, " .. self.name) end s:sayGoodbye() -- 输出 Goodbye, Bob ``` 通过在 `Person` 表中添加 `sayGoodbye` 方法,所有 `Person` 实例都可以访问该方法,包括 `Student` 的实例,因为它们共享相同的 `__index` 查找路径。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值