我正在尝试在Julia中创建一个链表。我有:
mutable struct LLNode{T}
x::T
next::Union{LLNode{T},Void}
prev::Union{LLNode{T},Void}
end
mutable struct LinkedList{T}
count::Int
head::Union{LLNode{T},Void}
tail::Union{LLNode{T},Void}
end
现在,上面的代码可以很好地编译。我还可以运行:x = LLNode(0,nothing,nothing)
fine。但是当我运行y = LinkedList(0,nothing,nothing)
时,我得到了一个no method matching LinkedList(::Int64, ::Void, ::Void)
错误。怎么回事?
VERSION
返回v"0.6.2"
发布于 2018-06-07 03:56:15
当您编写LLNode(0,nothing,nothing)
时,Julia能够确定它需要根据第一个参数的类型构造一个LLNode{Int}
。但是在LinkedList(0, nothing, nothing)
中,几乎没有任何东西可以让它继续确定类型参数应该是什么,所以它不知道要构造什么。
相反,您需要显式地选择您希望T
是什么:
julia> LinkedList{Int}(0, nothing, nothing)
LinkedList{Int64}(0, nothing, nothing)
或者,它可以基于非空参数获取T
:
julia> LinkedList(0, LLNode(0, nothing, nothing), nothing)
LinkedList{Int64}(0, LLNode{Int64}(0, nothing, nothing), nothing)
发布于 2018-06-07 03:56:08
原因是LinkedList
需要参数T
。如果将nothing
作为第二个和第三个参数传递,则Julia无法推断T
是什么。
因此,您必须显式指定它,例如:
julia> LinkedList{Int}(0, nothing, nothing)
LinkedList{Int64}(0, nothing, nothing)
或者传递允许推断T
的第二个和/或第三个参数,例如使用您的x
julia> LinkedList(0, x, x)
LinkedList{Int64}(0, LLNode{Int64}(0, nothing, nothing), LLNode{Int64}(0, nothing, nothing))
作为附注-您可能希望查看https://github.com/ChrisRackauckas/LinkedLists.jl,以获得一个相当完整的链表实现的示例。
https://stackoverflow.com/questions/50728288
复制相似问题