我试图在lua中找到类似于类的东西。在python中,我会这样做:
a = {}
type(a)
>>>> dict
所以我在lua中有对象词汇。当我打印对象时,我得到:
print(vocab)
>>> {
3 : 20
o : 72
m : 70
d : 61
( : 9
}
我如何让lua吐出对象,类似于python中的type()? - 它将为您提供对象的类
答案 0 :(得分:6)
There are 8 types in Lua
:nil,boolean,number,string,function,thread, table 和 userdata 。您可以使用内置的type()
函数找出对象所属的基本类型:
type('Hello world') == 'string'
type(3.14) == 'number'
type(true) == 'boolean'
type(nil) == 'nil'
type(print) == 'function'
type(coroutine.create(function() end)) == 'thread'
type({}) == 'table'
type(torch.Tensor()) == 'userdata'
请注意torch.Tensor
的类型是userdata。这是有道理的,因为torch
库是用C语言编写的。
提供类型userdata以允许存储任意C数据 在Lua变量中。 userdata值是指向raw块的指针 记忆。 Userdata在Lua中没有预定义的操作,除了 作业和身份测试。
userdata的metatable放在注册表和__index中 字段指向方法表,使对象:method() 语法将起作用。
因此,处理userdata对象时,我们不知道它是什么,但有一个方法列表并可以调用它们。
如果自定义对象具有某种机制(方法或某种东西)来查看其自定义类型,那将会很棒。你猜怎么着?火炬对象有一个:
t = torch.Tensor()
type(t) == 'userdata' # Because the class was written in C
torch.type(t) == 'torch.DoubleTensor'
# or
t:type() == 'torch.DoubleTensor'
说到Torch
。它有自己的对象系统模拟器,你可以自己创建一些火炬类,并以同样的方式检查它们的类型。但是,对于Lua
,这些类/对象只不过是普通表。
local A = torch.class('ClassA')
function A:__init(val)
self.val = val
end
local B, parent = torch.class('ClassB', 'ClassA')
function B:__init(val)
parent.__init(self, val)
end
b = ClassB(5)
type(b) == 'table' # Because the class was written in Lua
torch.type(b) == 'ClassB'
b:type() # exception; Custom Torch classes have no :type() method by defauld
答案 1 :(得分:3)
据说Lua定义了“机制,而不是政策”。课程将是一个“政策”。你可以随意实现类的效果; Lua提供了许多可用于实现此目的的机制。但Lua没有单一的方法来宣布这样的结构。
Lua的type
标准方法只会返回一个Lua值的广义类别:数字,字符串,表等。而且由于Lua只有一种数据结构(表),所以每种类(不是从C)生成的将是“表”类型。
这有副作用,使Lua难以使用别人的政策。例如,如果Torch有办法将自己的“类”与常规表区分开来,那就行了。但它无法区分某些其他类实现与常规表。
因此,没有一般方法可以将表与某种形式的“类”区分开来。