Julia学习笔记:参数化构造函数

Julia的参数化构造函数就是指构造函数类型参数化java

一、定义:函数


定义组合类型的时候能够不指定具体的参数类型,改用一个大写字母替代T,那么这就表示T能够是任意具体类型
(这个跟Java里面的泛型相似):code

struct Point{T<:Real}
           x::T
           y::T
   end

这里的T<:Real 表示T是Real的子孙类
Note: 和Java不一样的是这里定义的是一个类型的集合,而java中泛型类只表示带了一个类型参数而已:
这T不一样时对应的类型不一样,Piont{Int32} 和 Piont{Int64} 是不一样的类型。对象

二、初始化io


定义类型是虽然没有显示定义构造函数,可是有默认构造函数能够用:泛型

1.直接初始化,直接初始化时类型隐含在参数中,
只要x,y的类型相同而且都是Real子孙类就能够构造函数

Point(1,2)
Point(1.2,3.4)

下面这样会报错:
Point(1,3.4) 由于两个参数类型不一样,一个是Int,一个是Float方法

2.使用带具体类型的构造函数初始化集合

julia> Point(1,3)
Point{Int64}(1, 3)
julia> Point(1.2,3.9)
Point{Float64}(1.2, 3.9)

不一样的参数构造出来的类型不一样兼容

三、构造函数


1 内部构造函数
内部构造函数就是定义在类型内的狗仔函数,若是没定义,Julia自动提供默认构造函数,也能够显示定义,以下的定义和默认构造函数同样

julia> struct Point{T<:Real}
           x::T
           y::T
           Point{T}(x,y) where {T<:Real} = new(x,y)
       end

2 外部构造函数
外部构造函数是在类型外部定义的,定义号类型以后能够在外部定义他的构造函数,外部构造函数只能调用内部构造函数初始化对象
假如咱们但愿这样构造一个对象Point(1,2.3),由于咱们但愿数字类型能够兼容,那么咱们能够定义一个外部构造函数

Point(x::Int64, y::Float64) = Point(convert(Float64,x),y)

这里将Int64转换为Float64类型。
如今能够这样构造对象:

julia> Point(1,3.9)
Point{Float64}(1.0, 3.9)

3. 通用构造方法
若是咱们对每种数字类型都要定义不一样的外部构造函数显示转换的话会很麻烦,能够这样定义,对全部的数字类型自动转换

julia> Point(x::Real, y::Real) = Point(promote(x,y)...);

julia> Point(1//2,1)
Point{Rational{Int64}}(1//2, 1//1)

如上,前一个是分数,后面是整数, 都转换成了分数, 类型是Point{Rational{Int64}}, Rational是理数,分数表示,他的分子分母都是Int64

相关文章
相关标签/搜索