Julia的convert()何时使用?

asm*_*rer 7 julia

http://julia.readthedocs.org/en/latest/manual/conversion-and-promotion/上,有一个关于向浮点数等添加整数的讨论,最后它说

用户定义的类型可以通过定义与其他类型进行转换的方法,以及提供一些促销规则来定义与其他类型混合时应该提升的类型,从而轻松参与此促销系统.

从这里我推断,在定义我自己的数字类型时,我只需要定义如何将其转换为已知类型,以便它可以使用它上面的函数.但我尝试了这个似乎不起作用:

julia> type MyType
           n::Int
       end

julia> convert(::Type{Int}, x::MyType) = x.n
convert (generic function with 1 method)

julia> convert(Int, MyType(1))
1

julia> MyType(1) + 1
ERROR: `+` has no method matching +(::MyType, ::Int64)
Run Code Online (Sandbox Code Playgroud)

jch*_*jch 11

您的代码有两个问题:

  • 算术运算符+只能促进子类型Number;
  • 除转换功能外,还需要定义促销规则.

以下应该做你想要的:

module Test

import Base: convert, promote_rule

type MyType <: Number
    n :: Int
end

convert(::Type{Int}, x::MyType) = x.n

promote_rule(::Type{MyType}, ::Type{Int}) = Int

end
Run Code Online (Sandbox Code Playgroud)

  • `convert`告诉编译器在已经决定如何执行从`MyType`到`Int`的转换.`promote_rule`告诉编译器当它将`Int`和`MyType`都看作操作数时要执行的转换 - 是否将`MyType`转换为`Int`或`Int`转换为`MyType`. (7认同)