gpt4 book ai didi

lua - 为什么将参数传递给 lua 类方法得到 nill

转载 作者:行者123 更新时间:2023-12-02 00:43:12 24 4
gpt4 key购买 nike

我有一个从 lua 中的父列表指针构建树的方法。特别是我有这个 lua 表

parents = {2,3,13,5,12,7,11,9,10,11,12,13,14,0}

还有两个函数:

函数1(创建节点):

function create_node(parent, i, created, root)
if created[i] ~= nil then
return
end
print(i)
-- print(parent)
-- Create a new node and set created[i]
local new_node = Tree()
new_node.idx = i
created[i] = new_node


-- If 'i' is root, change root pointer and return
if parent[i] == 0 then
root[1] = created[i] -- root[1] denotes root of the tree

return
end

-- If parent is not created, then create parent first
if created[parent[i]] == nil then
create_node(parent, parent[i], created, root )
end
print(i)

-- Find parent pointer
local p = created[parent[i]]
print (p)

if #p.children <=2 then
print(p.idx)
print(created[i].idx)
p.add_child(created[i])
end

end

函数 2(递归创建树):我已经停止循环以测试从叶到根的第一条路径,即 1-2-3-13-14

function read_postorder_parent_tree(parents)
n = #parents

-- Create and array created[] to keep track
-- of created nodes, initialize all entries as None
created = {}

root = {}
for i=1, 1 do
create_node(parents, i, created, root)
end
return root[1]
end

create_note 方法使用下面的 Tree 类:

local Tree = torch.class('Tree')

function Tree:__init()
self.parent = nil
self.num_children = 0
self.children = {}
end

function Tree:add_child(c)

print(c)
c.parent = self
self.num_children = self.num_children + 1
self.children[self.num_children] = c
end

一切正常,但是当我调用 p.add_child(created[i]) 时,参数是 nil 为什么? (为什么 cnil?)我已经检查过 created[i]p 不是 。我该如何解决这个问题和/或为什么会这样?

这是我得到的错误:

./Tree.lua:16: attempt to index local 'c' (a nil value)
stack traceback:
./Tree.lua:16: in function 'add_child'
main.lua:120: in function 'create_node'
main.lua:109: in function 'create_node'
main.lua:109: in function 'create_node'
main.lua:109: in function 'create_node'
main.lua:134: in function 'read_postorder_parent_tree'
main.lua:153: in function 'main'
main.lua:160: in main chunk
[C]: in function 'dofile'
...3rto/torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:150: in main chunk
[C]: at 0x00405d50

最佳答案

如果你以面向对象的方式定义一个函数,你也必须以同样的方式调用它。

function Tree:add_child(c)

这使用冒号运算符 以面向对象的方式声明了一个函数。为了帮助您理解这意味着什么,可以这样重写:

Tree.add_child = function(self, c)

如您所见,创建了一个隐式 self 参数来反射(reflect)调用该函数的对象。但是,您可以通过标准方式调用该函数:

p.add_child(created[i])

现在您可以看到您真正做的是将 created[i] 作为 self 传递,而不是作为 c,当然恰好为零。调用此类函数的标准方法也是通过冒号运算符:

p:add_child(created[i])

这会将 p 作为 self 隐式传递给实际函数,现在 p 将包含实际参数。

关于lua - 为什么将参数传递给 lua 类方法得到 nill,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45458806/

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