如何在 lua 中获取 class 类型/从 python 获取翻译

how to get the class type in lua / translation from python

我试图在 lua 中找到类似于 class 的内容。在 python,我会做:

a = {}
type(a)
>>>> dict

所以我在 lua 中有对象词汇。当我打印对象时,我得到:

print(vocab)
>>> {
3 : 20
o : 72
m : 70
d : 61
( : 9
}

如何让lua吐出对象,类似于python中的type()? - 这将为您提供对象

的 class

据说Lua定义了"mechanisms, not policies"。 类 将是 "policy"。您可以根据需要实现 classes 的效果; Lua 提供了许多可用于这样做的机制。但是 Lua 没有单一的方式来声明这样的结构。

Lua的type标准方法只会return一个Lua值的大类:数字、字符串、table等。由于 Lua 只有一种数据结构 (table),因此每一种 class(不是从 C 生成的)都属于 "table" 类型。

这会产生副作用,使 Lua 难以使用其他人的策略。例如,如果 Torch 有办法将它自己的 "classes" 与常规的 table 区分开来,那就行得通了。但它无法将某些 other class 实现与常规 table.

区分开来

所以没有通用的方法来区分 table 和某种形式的 "class"。

There are 8 types in Lua: nil, boolean, number, string, function, thread, table and userdata .您可以使用 built-in 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 语言编写的。

The type userdata is provided to allow arbitrary C data to be stored in Lua variables. A userdata value is a pointer to a block of raw memory. Userdata has no predefined operations in Lua, except assignment and identity test.

The metatable for the userdata is put in the registry, and the __index field points to the table of methods so that the object:method() syntax will work.

因此,处理用户数据对象时,我们不知道它是什么,但有它的方法列表并且可以调用它们。

如果自定义对象有某种机制(方法或其他东西)来查看它们的自定义类型,那就太好了。你猜怎么着?火炬对象有一个:

t = torch.Tensor()
type(t)       == 'userdata' # Because the class was written in C
torch.type(t) == 'torch.DoubleTensor'
# or
t:type()      == 'torch.DoubleTensor'

说到 Torch。它有自己的对象系统模拟器,你可以自由地自己创建一些 torch 类 并以相同的方式检查它们的类型。然而对于Lua来说,这样的classes/objects不过是普通的table罢了。

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