gpt4 book ai didi

Lua - 理解 setmetatable

转载 作者:行者123 更新时间:2023-12-04 00:35:46 26 4
gpt4 key购买 nike

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

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

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

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

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

3) 我的理解是,如果我使用 train_set.data[1] ,它将调用 __index .答案 here__indexkey 时调用表中不存在。但是是 t.data[1]train_set.data[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 时,它将始终使用索引表作为第一个参数并将索引作为第二个参数来调用。

关于Lua - 理解 setmetatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43128544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com