从 Lua 中的那个模块中的模块中引用 variables/functions

Reference variables/functions in a module from inside that module in Lua

我正在为电梯控制器编程。它使用一个 'API' 模块,其功能如 OpenDoor() 和值如 Floor。我如何在模块中使用这些值?

我试过使用 self 但没有成功。

local API = {

Lift=script.Parent,

--and now the problem

LiftCar=(self?).Lift.Car,

}

return API

当我尝试使用 self 时出现错误,因为 self 不存在。

Lua 中没有模块作为语言功能,只有 table 和词法范围。

如果您使用 table 来表示您的模块(您这样做),则必须像 table: LiftCar = API.Lift.Car 一样处理它,在您的情况下将是不可能的,因为 local API 在解析赋值时尚未定义。

Lua书中的

This chapter总结了各种制作模块的方法。

两种最简单的方法是预先定义 table:

local API = {}
API.Lift = script.Parent
...

或者将所有内容定义为本地并随后填充 table:

local function myfunction() do_something() end
local API = {my = myfuncion}

第一个选择是 preferred one

在 Roblox lua 中,就像提到的 DarkWiiPlayer 一样,您可以使用 require 功能在其他脚本中包含 ModuleScripts。

假设您在 ModuleScript 中定义了这样的 Elevator 对象:

local Elevator = {}
Elevator.__index = Elevator

function Elevator.new()
    local e = {
        currentFloor = 1
    }
    setmetatable(e, Elevator)
    return e
end

function Elevator:OpenDoor()
    print("Opening Door to : ", self.currentFloor)
end

return Elevator

放在它旁边的另一个脚本可以包含这样的代码:

local ElevatorModule = require(script.Parent.Elevator)

local anElevator = ElevatorModule.new()
anElevator:OpenDoor()

您的代码抱怨 self 不存在的原因是您定义函数的方式。 function Elevator.OpenDoor()function Elevator:OpenDoor() 之间有区别(注意冒号而不是句点)。

当您使用冒号定义函数时,将插入一个隐藏变量 self 作为第一个参数。

一个很好的例子是 string library :

-- repeat a string 5 times
local hw = "Hello World"
print( string.rep(hw, 5) )

-- works the same way as...
print( hw:rep(5) )

-- which (stupidly) also works the same way as...
print( hw.rep(hw, 5) )