Types 可空节点的Julia赋值

Types 可空节点的Julia赋值,types,julia,variable-assignment,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) =

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

getLeft(n)=Node(-1)
创建了一个新函数,可以为Node以外的任何类型进行编译(因为您为Node类型编写了一个更具体的函数:
getLeft(n::Node)=n.left

这就是为什么如果您在REPL中键入代码,您应该看到
getLeft(带有2个方法的通用函数)

你可能会想写信

左=左(n)
左=节点(-1)

但是这也不行,第一行为
n.left

然后,第二行创建一个节点,并将别名
left
重新分配给该节点,而
n
n.left
都不会被修改

您可以编写一个函数来分配左节点,例如

函数setLeft!(n,l)
n.左=左
结束

>设置左!(n,节点(-1))


但是你可能更喜欢直接赋值n.left

就是这样。你的位置是正确的。当然这也很有意义,因为节点(1)只是一个函数。所以我给函数getLeft()分配了一个函数Node()因此,这个故事的寓意是,赋值是在函数调用之前进行评估的。我想知道这个问题是否值得作为语言“bug”来讨论。撇开别名问题不谈,从语法上讲,OP希望
getLeft(n)
应该先求值并不是不合理的。也许应该要求已经定义的操作明确地声明
::在这种情况下,任何
类型都可以消除求值和新函数定义之间的歧义。事实上,不,不管怎样,我设法混淆了自己。
=
在julia中是always标记赋值,而不是“赋值构造函数”,所以语法在任何情况下都没有任何意义。我的错。