methods - julia 为包含 NTuple 的结构实现转换
问题描述
我正在尝试实现一个convert
for 结构,其中包含NTuple
:
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
定义的函数foo
并convert
具有相同的签名。由于某种原因,函数在throwsfoo
时正常返回。为什么 Julia 找不到我的方法?convert
MethodError
convert
朱莉娅版本 1.4.1
解决方案
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(())
or MyType{T, N}(())
,但 Julia 不知道如何处理仅传递的一个类型参数(默认情况下):
julia> MyType2((1,2,3))
MyType2{Int64,3}((1, 2, 3))
julia> MyType2{Int, 3}((1,2,3))
MyType2{Int64,3}((1, 2, 3))
julia> MyType2{Int}((1,2,3))
ERROR: MethodError: no method matching MyType2{Int64,T} where T(::Tuple{Int64,Int64,Int64})
Stacktrace:
[1] top-level scope at REPL[7]:1
[2] eval(::Module, ::Any) at ./boot.jl:331
[3] eval_user_input(::Any, ::REPL.REPLBackend) at /Users/mbauman/Julia/release-1.4/usr/share/julia/stdlib/v1.4/REPL/src/REPL.jl:86
[4] run_backend(::REPL.REPLBackend) at /Users/mbauman/.julia/packages/Revise/AMRie/src/Revise.jl:1023
[5] top-level scope at none:0
因此,解决方法是自己定义该方法,或者将转换方法的主体更改为MyType{T,N}
显式调用。
推荐阅读
- c++ - 我的 godRays 片段着色器哪里出错了?
- html - 移动视图中不需要的空白
- powerbi - 如何让我的 PBI 报告在新页面上填充每个查询结果?
- excel - 在 Visual Studio 中调试 Excel 插件
- python - Python乘以多维数组值
- sql - 在 redash 仪表板上,是什么原因导致“运行查询时出错:100035 (22007):无法识别时间戳 'd_yesterday'”?
- react-native - 如何在 React Native 中水平居中 TopTabNavigator?
- node.js - Puppeteer frame.type 只输入输入的第一个字符
- python - 以与 png 相同的方式使用来自 url 的 gif 的第一帧进行图像处理?
- excel-addins - 异步自定义功能在 Office 365 PC 中不起作用