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 然后第二行创建了一个节点,并为该节点重新分配了别名leftnn.left都没有被修改

你可以做的是编写一个函数来分配左节点,例如

function setLeft!(n, l)
    n.left = l
end

> setLeft!(n, Node(-1))

但您可能更愿意坚持直接分配 n.left