从 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) )
我正在为电梯控制器编程。它使用一个 '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
在解析赋值时尚未定义。
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) )