Julia分配给Nullable节点

时间:2017-09-06 10:40:13

标签: types julia variable-assignment

我正在尝试为可空节点分配值。为了使代码更具可读性,我编写了一个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”也可以。

1 个答案:

答案 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重新分配给该节点,nn.left都不会被修改

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

  

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

     

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

但你可能更喜欢直接分配n.left