cls.__supers = cls.__supers or {} 第一次为哪一个值为什么
时间: 2024-04-12 17:33:35 浏览: 200
在 Lua 中,`cls.__supers = cls.__supers or {}` 这行代码的作用是创建一个表 `cls.__supers`,如果 `cls.__supers` 已经存在,则不会重新创建,而是直接使用已存在的表。
当第一次执行这行代码时,如果 `cls.__supers` 不存在,即为 `nil`,那么 `cls.__supers or {}` 的结果就是一个空表 `{}`。然后将这个空表赋值给 `cls.__supers`。这样就确保了 `cls.__supers` 变量始终指向一个表。
当之后再次执行这行代码时,如果 `cls.__supers` 已经存在(即不为 `nil`),则 `cls.__supers or {}` 的结果就是 `cls.__supers` 本身,不会重新创建新的表。
这种用法常见于创建或初始化某个变量,确保变量始终指向一个表,以便后续向其中添加元素或进行其他操作。
相关问题
function class(classname, ...) local cls = {__cname = classname} local supers = {...} for _, super in ipairs(supers) do local superType = type(super) assert(superType == "nil" or superType == "table" or superType == "function", string.format("class() - create class \"%s\" with invalid super class type \"%s\"", classname, superType)) --异常捕获 if superType == "function" then assert(cls.__create == nil, string.format("class() - create class \"%s\" with more than one creating function", classname)); -- if super is function, set it to __create cls.__create = super elseif superType == "table" then if super[".isclass"] then -- super is native class assert(cls.__create == nil, string.format("class() - create class \"%s\" with more than one creating function or native class", classname)); cls.__create = function() return super:create() end else -- super is pure lua class cls.__supers = cls.__supers or {} cls.__supers[#cls.__supers + 1] = super if not cls.super then -- set first super pure lua class as class.super cls.super = super end end else error(string.format("class() - create class \"%s\" with invalid super type", classname), 0) end end cls.__index = cls if not cls.__supers or #cls.__supers == 1 then setmetatable(cls, {__index = cls.super}) else setmetatable(cls, {__index = function(_, key) local supers = cls.__supers for i = 1, #supers do local super = supers[i] if super[key] then return super[key] end end end}) end if not cls.ctor then -- add default constructor cls.ctor = function() end end cls.new = function(...) local instance if cls.__create then instance = cls.__create(...) else instance = {} end setmetatableindex(instance, cls) instance.class = cls instance:ctor(...) return instance end cls.create = function(_, ...) return cls.new(...) end return cls end
这段代码是一个用于创建类的函数,它使用了Lua语言的元表(metatable)和面向对象的概念。这个函数接受一个类名和可选的父类作为参数,并返回一个表示该类的table。
首先,该函数创建了一个空的类table `cls`,并设置了一个成员变量`__cname`来存储类名。
然后,通过循环遍历传入的父类参数数组,对每个父类进行类型检查和处理。如果父类是一个函数,则将其赋值给`__create`成员变量,用于创建实例对象。如果父类是一个table,并且具有`.isclass`成员变量,说明它是一个原生类(native class),将其创建函数赋值给`__create`成员变量。否则,将父类添加到`__supers`数组中,并将第一个父类设置为当前类的`super`成员变量。
接下来,设置了类的元表`__index`为类自身。如果类没有多个父类或者只有一个父类时,将元表设置为`cls.super`,否则设置一个自定义的元方法,该元方法会在访问不存在的成员时,依次查找父类中对应的成员。
然后,检查类是否有构造函数`ctor`,如果没有,则添加一个空的默认构造函数。
接着,定义了一个用于创建实例对象的方法`new`,它根据存在与否的`__create`成员变量,选择调用父类的创建函数或直接创建一个空的table作为实例对象。然后,通过`setmetatableindex`函数设置实例对象的元表,使其可以访问到类中的成员。最后,将类信息和构造函数参数传递给构造函数`ctor`并返回实例对象。
最后,定义了一个别名方法`create`,用于创建实例对象。
整体上,这段代码是一个简单的Lua实现的类系统,可以用于创建类和实例化对象,并支持继承和多继承的特性。
setmetatable(cls, {__index = function(_, key) local supers = cls.__supers for i = 1, #supers do local super = supers[i] if super[key] then return super[key] end end end}),_和key回传入什么
在`setmetatable(cls, {__index = function(_, key) ... end})`这段代码中,`_`和`key`是函数的参数。
在Lua中,当使用`__index`元方法时,第一个参数(通常被命名为`self`)表示要访问元表的对象本身,而第二个参数(通常被命名为`key`)表示要访问的键值。
然而,在这段代码中,使用了一个匿名函数作为`__index`的值。匿名函数中的第一个参数通常被命名为`_`,用于表示当前函数的第一个参数,但在这里并没有使用它。而第二个参数则被命名为`key`,用于表示要访问的键值。
因此,在这段代码中,`_`和`key`分别表示当前函数的第一个参数(在这里没有使用)和要访问的键值。
阅读全文
相关推荐













