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))