代码之家  ›  专栏  ›  技术社区  ›  Alejandro Simkievich

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

  •  1
  • Alejandro Simkievich  · 技术社区  · 9 年前

    我试图找到一些类似于lua中的班级的东西。在python中,我会做:

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

    所以我有lua中的对象voab。当我打印对象时,我会得到:

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

    如何让lua吐出对象,类似于python中的type()?-它将给出对象的类

    2 回复  |  直到 9 年前
        1
  •  6
  •   Alexander Lutsenko    9 年前

    There are 8 types in Lua :nil,布尔值,数字,字符串,函数,线程, 桌子 用户数据 。您可以使用内置 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 是用户数据。这很有道理,因为 torch 图书馆是用C语言编写的。

    提供类型userdata以允许存储任意C数据 在Lua变量中。userdata值是指向原始数据块的指针 记忆力用户数据在Lua中没有预定义的操作 分配和身份测试。

    userdata的元表放在注册表中,__index 字段指向方法表,以便对象:method() 语法将起作用。

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

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

    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公司 然而,这样的类/对象只不过是普通的表。

    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
    
        2
  •  3
  •   Nicol Bolas    9 年前

    据说,Lua定义的是“机制,而不是政策”。上课将是一项“政策”。您可以按照自己的意愿实现类的效果;Lua提供了许多可以用来实现这一目的的机制。但是Lua没有一种方法来声明这样的构造。

    Lua的 type 标准方法将只返回Lua值的广泛类别:数字、字符串、表等。由于Lua只有一种数据结构(表),所以每种类(不是从C生成的)都是“表”类型。

    这有副作用,使Lua很难使用其他人的政策。例如,如果Torch有一种方法将自己的“类”与常规表区分开来,那就可以了。但它无法区分某些 另外 类实现。

    因此,没有通用的方法来区分表和某种形式的“类”。