Julia 茱莉亚是什么时候;是否使用了convert()?

Julia 茱莉亚是什么时候;是否使用了convert()?,julia,Julia,在,有一个关于向浮点数添加整数的讨论,等等,最后它说 用户定义的类型可以通过定义与其他类型之间的转换方法,并提供一些升级规则来定义它们与其他类型混合时应升级到的类型,从而轻松地参与此升级系统 由此我推断,在定义自己的数值类型时,我只需要定义如何将其转换为已知类型,以便它使用其上的函数。但我试过了,但似乎不起作用: julia> type MyType n::Int end julia> convert(::Type{Int}, x::MyType

在,有一个关于向浮点数添加整数的讨论,等等,最后它说

用户定义的类型可以通过定义与其他类型之间的转换方法,并提供一些升级规则来定义它们与其他类型混合时应升级到的类型,从而轻松地参与此升级系统

由此我推断,在定义自己的数值类型时,我只需要定义如何将其转换为已知类型,以便它使用其上的函数。但我试过了,但似乎不起作用:

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)

您的代码有两个问题:

  • +
    这样的算术运算符只提升
    数字的子类型
    
  • 除了转换函数外,还需要定义升级规则
以下操作应满足您的要求:

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
模块测试
导入基础:转换、升级\u规则

类型MyType您能解释升级和转换之间的区别吗?
convert
告诉编译器如何执行从
MyType
Int
的转换,如果已经决定这样做
promote\u规则
告诉编译器在将
Int
MyType
都视为操作数时执行哪种转换-是将
MyType
转换为
Int
还是将
Int
转换为
MyType
。对于您的代码,我得到
错误:MyType和Int64 in+at>不存在升级promotion.jl:158
。您可能需要重新启动REPL,或使用模块限定:
m=Test.MyType(5);m+3
。会话中可能已经有了不同的
MyType
概念。