朱莉娅:将变量点更改为方法中的新位置

时间:2018-08-22 02:24:43

标签: julia

我正在编码一个链表,链表以普通节点开始,以Nil节点结束,这是我的代码:

abstract type LinkedList  end

struct Nil <: LinkedList
end

mutable struct Node <: LinkedList
    value::Any
    nextNode:: LinkedList
end

function append!(headNode::LinkedList, ele::Any)
    if isa(headNode, Nil)
        headNode =  Node(ele, Nil())
        return headNode
    else
        n = headNode
        while !isa(n.nextNode, Nil)
            n = n.nextNode
        end
        n.nextNode = Node(ele, n.nextNode)
        return headNode
    end
end

linkedList() = Nil()
l = linkedList()

当我将元素附加到空链接时,我输入

l = append!(l, 3)
# l is 3 -> Nil

但是我想看起来像这样

append!(l, 3)
# change l without re-assign l  

1 个答案:

答案 0 :(得分:1)

您好,欢迎来到Stackoverflow。

让我从一般的事情开始。在Julia中,您不能重新分配函数参数,即使其指向其他位置,例如新对象。您只能修改可变类型对象(例如向量)的内容。有关更多详细信息,请参见https://stackoverflow.com/a/39294877/2365675

基于此,让我们看看代码的作用。您的Nil类型是不可变的,因此您无法对其进行修改。您正在append!的第一个分支中创建一个新的Node对象并返回它。但是,Node对象是可变的,您可以在第二个分支中利用该对象,在第二个分支中,您通过浏览链接列表并指向最后一个(可变)节点,使其指向新节点而不是Nil()来对其进行修改。因此,您正在修改函数的第一个参数headNode

我不确定您想要什么。我建议始终使用l = append(l, 3)方法(不要修改旧对象)。在我看来,将链表从左侧而不是右侧(在Nil处)变得更容易,更干净。

无论如何,都有一个包DataStructures.jl,其中也包含一个linked list implementation。我建议您看一看(前14行就足够了),然后事情就会变得更加清晰。