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
的语义为在被隐式调用提供「安全」的转换而不产生惊奇,这通常意味着它们是相近意义的对象并且转换是无损的- 构造函数可以做很多其他事情:
- 与转 换语义无关的任意构造
- 对于可变集合类型来说构造函数总会创建新对象,而转换则会返回原有对象
- 对于「包裹」类型来说构造函数可能会再加一层,而转换则会返回原有对象
- 构造函数可能不返回对应类型的值
对于一部分抽象类型(Number
、AbstractString
、AbstractArray
、AbstractDict
),Julia 认为它们的子类型之间已经非常相似了,所以已经定义了它们之间的转换等价于构造,且定义了单位转换运算:
convert(::Type{T}, x::Number) where {T<:Number} = T(x)
convert(::Type{T}, x::T) where {T<:Number} = x
这样,这些类型就可以只实现构造函数。