在Julia文档手册中,它显示以下[1]:
何时调用转换?
以下语言构造了调用convert:
- 分配给数组将转换为数组的元素类型。
[1] https://docs.julialang.org/en/v1/manual/conversion-and-promotion/#When-is-convert-called?-1
我定义了以下代码:
julia> abstract type Element end
julia> abstract type Inline <: Element end
julia> struct Str <: Inline
content::String
end
julia> convert(::Type{Str}, e::String) = Str(e)
convert (generic function with 1 method)
julia> convert(::Type{Element}, e::String) = convert(Str, e)
convert (generic function with 2 methods)
我为Julia类型convert
定义了String
。从类型Element
的实例转换为Str
并转换为String
的工作正常。但是,以下操作失败:
julia> convert(Str, "hi")
Str("hi")
julia> convert(Element, "hi")
Str("hi")
julia> arr = Element[]
0-element Array{Element,1}
julia> push!(arr, "hi")
ERROR: MethodError: Cannot `convert` an object of type String to an object of type Element
Closest candidates are:
convert(::Type{T}, ::T) where T at essentials.jl:168
Stacktrace:
[1] push!(::Array{Element,1}, ::String) at ./array.jl:866
[2] top-level scope at REPL[25]:1
julia> arr = Str[]
0-element Array{Str,1}
julia> push!(arr, "hi")
ERROR: MethodError: Cannot `convert` an object of type String to an object of type Str
Closest candidates are:
convert(::Type{T}, ::T) where T at essentials.jl:168
Str(::String) at REPL[19]:2
Str(::Any) at REPL[19]:2
Stacktrace:
[1] push!(::Array{Str,1}, ::String) at ./array.jl:866
[2] top-level scope at REPL[27]:1
julia>
有人可以解释为什么上述失败吗?以及如何(如果可能的话)防止其失败?
答案 0 :(得分:3)
您的代码的主要提示是此行:
转换(一种方法的泛型函数)
这意味着convert
函数只有一个定义(您的定义),所以出了点问题。当Julia使用convert
时,它实际上会调用Base.convert
。因此,重载适当的方法:
Base.convert(::Type{Str}, e::String) = Str(e)
Base.convert(::Type{Element}, e::String) = convert(Str, e)
与您的代码一样工作。
简而言之,您的代码是正确的,只是重载了错误的转换(在使用Julia核心函数时始终添加Base.method
)