MethodError调用参数struct的构造函数

时间:2018-06-06 19:38:53

标签: struct julia

我正在尝试在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"

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以获得相当完整的链表实现示例。