首页 文章

在Lua中进行类型检查的OOP

提问于
浏览
0

我正在尝试在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))

......都是零 . 任何想法我如何获得属性的类型(字符串,布尔值,数字)?

3 回答

  • 0

    这一行:

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

    并不意味着你认为它意味着什么 . 这是 Value 观 .

    当你执行 {Volkswagen} 时,你正在做的是告诉Lua在字符串名称 "Volkswagen" 下获取当前存储在全局表中的值 . 我'll assume that there'存储了一些值 .

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

    除非LuaJava定义它们,否则"attributes"(String,Boolean,Number)不存在 . 他们're just empty values. You can' t传递一个空值 . 你可以传递一个字符串,但那是不同的 .

    你没有很好地解释你的 Class 函数到底应该做什么,所以我可以't give you a hint on how to do what it is you'试图做得更好 .

  • 3

    如果你're just looking for a generic Lua class system, here'我的实施:https://gist.github.com/1722329

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

  • 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({“Volkswagen”,“Vehicle”,model =“”,speed = 0,driving = false})

相关问题