Methods julia为包含NTuple的结构实现转换

Methods julia为包含NTuple的结构实现转换,methods,types,julia,Methods,Types,Julia,我正在尝试为包含NTuple的结构实现convert: import Base: convert abstract type AbstractMyType{N, T} end struct MyType1{N, T} <: AbstractMyType{N, T} data::NTuple{T, N} end struct MyType2{N, T} <: AbstractMyType{N, T} data::NTuple{T, N} end foo(::Ty

我正在尝试为包含
NTuple
的结构实现
convert

import Base: convert

abstract type AbstractMyType{N, T} end

struct MyType1{N, T} <: AbstractMyType{N, T}
    data::NTuple{T, N}
end

struct MyType2{N, T} <: AbstractMyType{N, T}
    data::NTuple{T, N}
end

foo(::Type{MyType2}, x::AbstractMyType{N, T}) where {N, T} = x
convert(::Type{MyType2}, x::AbstractMyType{N, T}) where {N, T} = MyType2{T}(x.data)

println(foo(MyType2, MyType1((1,2,3))))         # MyType1{Int64,3}((1, 2, 3))
println(convert(MyType2, MyType1((1,2,3))))     # MethodError
导入基础:转换 抽象类型AbstractMyType{N,T}end struct MyType1{N,T}Julia正在查找转换方法:

julia> println(convert(MyType2, MyType1((1,2,3))))     # MethodError
ERROR: MethodError: no method matching MyType2{3,T} where T(::Tuple{Int64,Int64,Int64})
Stacktrace:
 [1] convert(::Type{MyType2}, ::MyType1{Int64,3}) at ./REPL[16]:1
 [2] top-level scope at REPL[18]:1
堆栈跟踪表示它在
convert
函数中(在我的例子中,我在第16个REPL提示符的第一行定义了它)。问题是它找不到
MyType2{T}(::Tuple)
构造函数

当您不使用内部构造函数时,Julia会自动为您创建许多构造函数;在这种情况下,您可以调用
MyType(())
MyType{T,N}(())
,但Julia不知道如何处理只传递的一个类型参数(默认情况下):

因此,解决方法是自己定义该方法,或者将convert方法的主体更改为显式调用
MyType{T,N}

Julia正在查找您的convert方法:

julia> println(convert(MyType2, MyType1((1,2,3))))     # MethodError
ERROR: MethodError: no method matching MyType2{3,T} where T(::Tuple{Int64,Int64,Int64})
Stacktrace:
 [1] convert(::Type{MyType2}, ::MyType1{Int64,3}) at ./REPL[16]:1
 [2] top-level scope at REPL[18]:1
堆栈跟踪表示它在
convert
函数中(在我的例子中,我在第16个REPL提示符的第一行定义了它)。问题是它找不到
MyType2{T}(::Tuple)
构造函数

当您不使用内部构造函数时,Julia会自动为您创建许多构造函数;在这种情况下,您可以调用
MyType(())
MyType{T,N}(())
,但Julia不知道如何处理只传递的一个类型参数(默认情况下):

因此,解决方法是要么自己定义该方法,要么将convert方法的主体更改为显式调用
MyType{T,N}

只需定义该方法即可

convert(::Type{MyType2}, x::AbstractMyType{N, T}) where {N, T} = MyType2(x.data)
测试:

julia> convert(MyType2, MyType1((1,2,3)))
MyType2{Int64,3}((1, 2, 3))
只需定义方法

convert(::Type{MyType2}, x::AbstractMyType{N, T}) where {N, T} = MyType2(x.data)
测试:

julia> convert(MyType2, MyType1((1,2,3)))
MyType2{Int64,3}((1, 2, 3))