newcomer:main(actor)和 newcomer.main(actor)有什么区边
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-26 00:55:02 |
👁️ 阅读: 8
我是lua后端老师!
小仙,这个问题问得很好!在Lua脚本中,`newcomer:main(actor)`和`newcomer.main(actor)`是有本质区别的。
简单来说:
* `newcomer.main(actor)` 是普通的函数调用,把 `actor` 作为参数传递给 `main` 函数。
* `newcomer:main(actor)` 是面向对象风格的“方法”调用,它会隐式地把调用者 `newcomer` 作为第一个参数(通常叫 `self`)传递给 `main` 函数,所以你实际传进去的参数是 `self` 和 `actor`。
让我用代码来演示一下:
```lua
-- 假设我们有一个表(table)叫 newcomer
local newcomer = {}
-- 1. 定义一个普通函数
function newcomer.main(actor)
release_print("普通函数调用,actor 是: " .. actor)
end
-- 调用方式1:普通函数调用
newcomer.main("玩家A") -- 正确,打印:普通函数调用,actor 是: 玩家A
-- 调用方式2:错误的方法调用
-- newcomer:main("玩家A") -- 这会把 newcomer 作为第一个参数传给 main,相当于 main(newcomer, "玩家A")
-- 如果函数定义是 function newcomer.main(actor),那么这里 actor 接收到的值就是 newcomer 这个表本身,而不是字符串"玩家A"。
-- 2. 定义一个方法(使用冒号语法糖)
function newcomer:main2(actor)
release_print("方法调用,self 是表,actor 是: " .. actor)
end
-- 调用方式1:正确的方法调用
newcomer:main2("玩家B") -- 正确,打印:方法调用,self 是表,actor 是: 玩家B
-- 这等价于 newcomer.main2(newcomer, "玩家B")
-- 调用方式2:普通的函数调用(需要手动传入self)
newcomer.main2(newcomer, "玩家C") -- 正确,打印:方法调用,self 是表,actor 是: 玩家C
```
**在996引擎中的关键点:**
引擎的QF触发接口(比如 `login`, `killmon`),其函数定义是**普通函数**,第一个参数就是玩家对象 `actor`。例如:
```lua
-- QFunction-0.lua 中的标准写法
function login(actor)
sendmsg(actor, "欢迎登录!")
end
```
所以,**在QF脚本里,我们只能使用 `login(actor)` 这种形式来定义和触发,绝对不能写成 `actor:login()`**,因为引擎内部调用时是传单个参数 `actor` 进来的。
**总结一下:**
* **`.` 操作符**:用于访问表的字段(包括函数),调用时需要显式传递所有参数。
* **`:` 操作符**:是Lua的语法糖,用于面向对象编程。`obj:func(args)` 会被转换成 `obj.func(obj, args)`,自动把 `obj` 自己作为第一个参数 `self` 传入。
在我们引擎的日常脚本开发中,大部分时间你接触的都是用 `.` 定义的普通函数。除非你或者你使用的库明确使用了面向对象的写法(比如给 `actor` 这个字符串对象扩展了一些方法),否则统一使用 `函数名(参数)` 的方式调用即可。
记住这个区别,以后看到别人的代码就不会混淆啦!如果还有不明白的,随时可以再问我,或者请教浮生梦尊师哦!
← 返回问答库