1

我正在尝试在 Lua 中实现具有继承的类。此外,在创建新对象时,需要进行某种“类型检查”。

一个特殊的要求是使用特定的语法来创建一个类(示例):

Class({Volkswagen, Vehicle, model=String, speed=Number, driving=Boolean})

请注意,参数作为可变长度的列表传递。所以我需要一个函数来获取任意数量的参数:

function Class (arguments)
    name = arguments[1]
    superclass = arguments[2]
    ...
end

前两个参数是类的名称和继承它的类的名称。

我确信解决方案很简单,但我完全不知道如何处理属性的键值对,例如......

print(arguments.model)
print(type(arguments.model))

...都是零。有什么想法可以获取属性的类型(字符串、布尔值、数字)吗?

4

3 回答 3

3

这一行:

{Volkswagen, Vehicle, model=String, speed=Number, driving=Boolean}

并不意味着你认为它意味着什么。是价值观。

当您这样做时{Volkswagen},您所做的是告诉 Lua 获取当前存储在全局表中字符串 name 下的值"Volkswagen"。我假设那里存储了一些价值。

您的问题是{model=String}将当前存储在全局表中的字符串名称下的值"String"放入表中。没有名为 的全局变量的可能性很大"String"。这意味着你放在nil桌子上。

除非 LuaJava 定义它们,否则“属性”(字符串、布尔值、数字)不存在。它们只是空值。您不能传递空值。您可以传递一个string,但这是不同的。

你没有很好地解释你Class的这个功能到底应该做什么,所以我不能给你一个关于如何做你想做的更好的事情的提示。

于 2012-04-29T12:52:34.113 回答
0

如果你只是在寻找一个通用的 Lua 类系统,这里是我的实现: https ://gist.github.com/1722329

它不支持类型检查,但应该可以使用“TypedClass”类轻松实现,作为所有严格类型类的基础。

于 2012-04-29T14:56:35.940 回答
0

为了处理键值对,您可能需要使用内置表函数将引用的表传输到本地表:

function Class(params)
local arguments={}

function transfer(k, v)
  arguments[k]=v
end

--transfer referenced table to local table
table.foreach (params, transfer)

print(arguments[1])
print(arguments[2])
print(arguments.model)
print(arguments.speed)
print(arguments.driving)

结尾

Class({"大众","Vehicle", model="" , speed=0 ,driving=false} )

于 2012-04-29T16:15:03.270 回答