我正在尝试为可空节点分配值。为了使代码更具可读性,我编写了一个getter函数。使用getter函数为节点赋值时,它不起作用。有什么想法吗?
以下是代码:
type Node
data
left::Nullable{Node}
right::Nullable{Node}
Node() = (x = new(); x.left = Nullable{Node}(); x.right = Nullable{Node}(); x)
Node(data) = (x = new(); x.data = data; x.left = Nullable{Node}(); x.right = Nullable{Node}(); x)
end
# Helper function to return the left node
getLeft(n::Node) = n.left
n = Node(1)
# This is what I would like to have, however it returns
# "getLeft":
getLeft(n) = Node(-1)
# what works is to write:
n.left = Node(-1)
当然我也试着写:
function getLeft(n::TreeNode)
return n.left
end
没有任何区别。
我不明白为什么“getLeft”函数不允许赋值,即使它返回“n.left”,并且直接赋值给“n.left”也可以。
答案 0 :(得分:2)
行getLeft(n) = Node(-1)
创建一个新函数,可以为Node以外的任何类型编译(因为你为类型节点编写了一个更具体的函数:getLeft(n::Node) = n.left
如果您在REPL中键入代码,那么您应该看到getLeft (generic function with 2 methods)
。
你可能想写
left = getLeft(n)
left =节点(-1)
但这也行不通,第一行为left
指向的对象创建了一个别名n.left
然后第二行创建一个节点并将别名left
重新分配给该节点,n
或n.left
都不会被修改
你可以做的是写一个函数来分配一个左边的节点,例如
function setLeft!(n,l)
n.left = l
端> setLeft!(n,Node(-1))
但你可能更喜欢直接分配n.left