Julia 分配给可空节点
Julia assignment to Nullable Node
我正在尝试为可空节点赋值。为了使代码更具可读性,我写了一个 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" 函数不允许赋值,尽管它 return "n.left" 和直接赋值给 "n.left" 有效。
getLeft(n) = Node(-1)
行创建了一个新函数,可以为 Node 以外的任何类型编译(因为您为节点类型编写了一个更具体的函数:getLeft(n::Node) = n.left
这就是为什么如果您在 REPL
中键入代码,您应该看到 getLeft (generic function with 2 methods)
您可能会想写
left = getLeft(n)
left = Node(-1)
但这也行不通,第一行为 n.left
指向的对象创建了一个别名 left
然后第二行创建了一个节点,并为该节点重新分配了别名left
,n
和n.left
都没有被修改
你可以做的是编写一个函数来分配左节点,例如
function setLeft!(n, l)
n.left = l
end
> setLeft!(n, Node(-1))
但您可能更愿意坚持直接分配 n.left
我正在尝试为可空节点赋值。为了使代码更具可读性,我写了一个 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" 函数不允许赋值,尽管它 return "n.left" 和直接赋值给 "n.left" 有效。
getLeft(n) = Node(-1)
行创建了一个新函数,可以为 Node 以外的任何类型编译(因为您为节点类型编写了一个更具体的函数:getLeft(n::Node) = n.left
这就是为什么如果您在 REPL
getLeft (generic function with 2 methods)
您可能会想写
left = getLeft(n)
left = Node(-1)
但这也行不通,第一行为 n.left
指向的对象创建了一个别名 left
然后第二行创建了一个节点,并为该节点重新分配了别名left
,n
和n.left
都没有被修改
你可以做的是编写一个函数来分配左节点,例如
function setLeft!(n, l)
n.left = l
end> setLeft!(n, Node(-1))
但您可能更愿意坚持直接分配 n.left