如何在 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
我试图在 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