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

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

1、定义:


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

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

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

2、初始化


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

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)

不同的参数构造出来的类型不同

3、构造函数


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值