【问题标题】:Having some trouble with Julia's conversion rules对 Julia 的转换规则有一些问题
【发布时间】:2019-10-01 04:20:42
【问题描述】:

在 Julia 文档手册中,它说以下 [1]:

什么时候调用转换?

以下语言结构调用转换:

  • 分配给数组会转换为数组的元素类型。

[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 类型 String 定义了 convert。从String 类型的实例转换为Element 和转换为Str 可以按预期工作。但是,以下失败:

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>

有人可以解释为什么上述失败了吗?如果可能的话,如何防止它失败?

【问题讨论】:

    标签: julia


    【解决方案1】:

    您的代码的主要提示是这一行: 转换(具有 1 种方法的通用函数) 这意味着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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多