我正在尝试在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)
很好。但是当我运行y = LinkedList(0,nothing,nothing)
时出现no method matching LinkedList(::Int64, ::Void, ::Void)
错误。是什么给了什么?
VERSION
返回v"0.6.2"
答案 0 :(得分:3)
当你写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)
答案 1 :(得分:1)
原因是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以获得相当完整的链表实现示例。