【问题标题】:Lua - understanding setmetatableLua - 理解 setmetatable
【发布时间】:2017-08-25 00:13:02
【问题描述】:

我正在尝试使用Torch 7 构建CNN。我对Lua 很陌生。我试图关注这个link。我在下面的代码块中遇到了一个叫setmetatable 的东西:

setmetatable(train_set, 
{
  __index = function(t, i) 
    return {t.data[i], t.label[i]}
  end
});

我知道第二个参数充当表 train_set 的元表。

1) t 是元表还是 t 只是 train_set 的另一个名称?

2) 每当针对__index 使用函数时,解释器是否假定第一个参数(t)是一个表(或元表,取决于对第一个问题的回答)?第二个参数总是key 还是index

3) 我的理解是,如果我使用train_set.data[1],它将调用__index。答案here 表示__index 在表中不存在key 时被调用。但是t.data[1]train_set.data[1] 一样吗?如果是这样,口译员是怎么知道的?

【问题讨论】:

    标签: lua lua-table torch metatable


    【解决方案1】:
    setmetatable(train_set, 
    {
      __index = function(t, i) 
        return {t.data[i], t.label[i]}
      end
    })
    

    这里有一些名为 train_set 的表。通过这个函数调用,我们将它的元表设置为

     {
      __index = function(t, i) 
          return {t.data[i], t.label[i]}
      end
     }
    

    这是一个匿名表。如果这对您来说难以阅读,您也可以这样写:

    local my_metatable = {
      __index = function(t, i) 
         return {t.data[i], t.label[i]}
      end
    }
    setmetatable(train_set, my_metatable)
    

    在那个元表中,我们实现了元方法__index。通过这样做,我们告诉 Lua 当有人索引 train_set 中不存在的字段时该怎么做。

    所以当我们要求 Lua 给我们存储在 train_set[4] 中的值时,例如 train_set[4]nil,Lua 会检查 __index 是否被实现。如果是这样,它将调用__index(train_set, 4) 并给你它的返回值,否则返回nil 所以解释器知道 t.data[1] 和 train_set.data[1] 是一样的,因为他是把 train_set 放入 __index 的人。

    因此,当您实现 __index 时,它将始终使用索引表作为第一个参数并使用索引作为第二个参数来调用它。

    【讨论】:

      【解决方案2】:

      首先,两个重要环节:

      现在答案:

      1. t,元表中__index方法的第一个参数,指的是元表的表,这里是train_set。此参数允许为多个表重用相同的元表。

      2. __index 是元表中的一个特殊 函数(查看metatable events),每当元表中的字段被访问但丢失时都会调用该函数。例如,如果train_set 不包含键k 而您读取 train_set.k,则会在其元表中调用__index (train_set, "k")

      3. 从我可以从代码中推断出,使用模式在您的示例中看起来像 local x = train_set [1],它将返回一个包含 { train_set.data[i], train_set.label[i] } 的表。

      【讨论】:

        猜你喜欢
        • 2019-09-10
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 2021-11-24
        • 2015-02-10
        • 2016-10-05
        • 2014-07-15
        • 1970-01-01
        相关资源
        最近更新 更多