【问题标题】:Reference variables/functions in a module from inside that module in Lua从 Lua 中的模块内部引用模块中的变量/函数
【发布时间】:2019-12-12 07:45:04
【问题描述】:

我正在编写电梯控制器。它使用具有OpenDoor() 之类的函数和Floor 之类的值的“API”模块。如何在模块中使用这些值?

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

local API = {

Lift=script.Parent,

--and now the problem

LiftCar=(self?).Lift.Car,

}

return API

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

【问题讨论】:

    标签: lua roblox


    【解决方案1】:

    Lua 中没有模块作为语言特性,只有表和词法范围。

    如果您使用表格来表示您的模块(您这样做),您必须像表格一样处理它:LiftCar = API.Lift.Car,在您的情况下这是不可能的,因为本地 API 还没有在解析分配的那一刻定义。

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

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

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

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

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

    第一种选择是preferred one

    【讨论】:

    • 谢谢,这些在 ROBLOX lua 中被称为模块。
    • 在 Lua 中,module 是你require 的东西。该表实际上比其他任何东西都更像是一个实现细节,但是当该表是对require 的调用的返回值时,这些术语几乎可以互换。 100% 具体来说,你会说它是 module table,其中“table”描述了它是什么,“module”描述了它的用途。无论如何,就这个问题而言,它们可以被视为同一事物。
    • 我更喜欢第二种方法,因为它不受返回表名称更改的影响。其实更简单,不命名直接返回表即可。
    【解决方案2】:

    在 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) )
    

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2016-07-23
      相关资源
      最近更新 更多