Lua - 理解setmetatable

skr*_*obo 3 lua metatable lua-table torch

我正在尝试构建一个CNN使用Torch 7. 我很新Lua。我试图点击此链接。我遇到了setmetatable以下代码块中调用的内容:

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

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

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

2)每当一个函数用于反对 时__index,解释器是否假设第一个参数(t)是一个表(或元表,取决于第一个问题的答案)?第二个参数总是 orkeyindex

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

Pig*_*let 6

setmetatable(train_set, 
{
  __index = function(t, i) 
    return {t.data[i], t.label[i]}
  end
})
Run Code Online (Sandbox Code Playgroud)

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

 {
  __index = function(t, i) 
      return {t.data[i], t.label[i]}
  end
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

因此,当我们要求 Lua 提供存储在train_set[4]例如 和train_set[4]is中的值时nil,Lua 会检查是否__index已实现。如果是这样,它会调用__index(train_set, 4)并给你它的返回值或以其他方式返回nil 所以解释器知道t.data[1]与train_set.data[1]相同,因为他是将train_set放入__index的人。

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