首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MethodError调用参数化结构的构造函数

MethodError调用参数化结构的构造函数
EN

Stack Overflow用户
提问于 2018-06-07 03:38:53
回答 2查看 43关注 0票数 3

我正在尝试在Julia中创建一个链表。我有:

代码语言:javascript
复制
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"

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-07 03:56:15

当您编写LLNode(0,nothing,nothing)时,Julia能够确定它需要根据第一个参数的类型构造一个LLNode{Int}。但是在LinkedList(0, nothing, nothing)中,几乎没有任何东西可以让它继续确定类型参数应该是什么,所以它不知道要构造什么。

相反,您需要显式地选择您希望T是什么:

代码语言:javascript
复制
julia> LinkedList{Int}(0, nothing, nothing)
LinkedList{Int64}(0, nothing, nothing)

或者,它可以基于非空参数获取T

代码语言:javascript
复制
julia> LinkedList(0, LLNode(0, nothing, nothing), nothing)
LinkedList{Int64}(0, LLNode{Int64}(0, nothing, nothing), nothing)
票数 3
EN

Stack Overflow用户

发布于 2018-06-07 03:56:08

原因是LinkedList需要参数T。如果将nothing作为第二个和第三个参数传递,则Julia无法推断T是什么。

因此,您必须显式指定它,例如:

代码语言:javascript
复制
julia> LinkedList{Int}(0, nothing, nothing)
LinkedList{Int64}(0, nothing, nothing)

或者传递允许推断T的第二个和/或第三个参数,例如使用您的x

代码语言:javascript
复制
julia> LinkedList(0, x, x)
LinkedList{Int64}(0, LLNode{Int64}(0, nothing, nothing), LLNode{Int64}(0, nothing, nothing))

作为附注-您可能希望查看https://github.com/ChrisRackauckas/LinkedLists.jl,以获得一个相当完整的链表实现的示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50728288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档