跳到主要内容

Julia 转换

阐述

类型转换是由函数 convert 和一系列形如 convert(T, x) 的方法完成的,它的意义在于不显式写出类型 T 的情况下在特定场合完成自动转换。这些场合包括:

  • Julia 阵列的元素赋值
  • Julia 复合类型的字段赋值
  • new 构造对象
  • 给声明了类型的变量赋值
  • 声明了返回类型的函数

可以自己定义转换函数的方法:

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

实例

julia> x = 12
12

julia> typeof(x)
Int64

julia> xu = convert(UInt8, x)
0x0c

julia> typeof(xu)
UInt8

julia> xf = convert(AbstractFloat, x)
12.0

julia> typeof(xf)
Float64

julia> a = Any[1 2 3; 4 5 6]
2×3 Matrix{Any}:
1 2 3
4 5 6

julia> convert(Array{Float64}, a)
2×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0

性质

相关内容

与构造函数的比较

  • convert 的语义为在被隐式调用提供「安全」的转换而不产生惊奇,这通常意味着它们是相近意义的对象并且转换是无损的
  • 构造函数可以做很多其他事情:
    • 与转换语义无关的任意构造
    • 对于可变集合类型来说构造函数总会创建新对象,而转换则会返回原有对象
    • 对于「包裹」类型来说构造函数可能会再加一层,而转换则会返回原有对象
    • 构造函数可能不返回对应类型的值

对于一部分抽象类型(NumberAbstractStringAbstractArrayAbstractDict),Julia 认为它们的子类型之间已经非常相似了,所以已经定义了它们之间的转换等价于构造,且定义了单位转换运算:

convert(::Type{T}, x::Number) where {T<:Number} = T(x)
convert(::Type{T}, x::T) where {T<:Number} = x

这样,这些类型就可以只实现构造函数。

参考文献