上QQ阅读APP看书,第一时间看更新
6.5.2 默认构造函数
在声明复合类型后,对其实例化的最简单做法是采用如下的形式:
类型名(成员值1, 成员值2, …) # 其中三点省略符,指余下还有其他的成员实参值
这与函数(关于函数的更多概念,参见第7章)的常规调用方式极为相似,只不过函数名正好是类型名。调用时,只需在参数列表中按字段定义的顺序逐一给出每个字段的值即可。例如:
julia> x = FooA(1, 2.5) FooA(1, 2.5) julia> isa(x, FooA) true
便可得到FooA的复合类型对象x变量,其中a取1而b取2.5。
事实上,在复合类型声明的同时,Julia内部会自动为其提供默认的构造方法(Constructors),而且一般会有两种形式。以FooA为例,默认构造方法为:
FooA(a, b::Float64) FooA(a, b)
可见构造方法是与类型同名的函数,而且默认构造方法的参数个数与字段数一致。
这两个默认构造方法的差异为:
·前者参数表依据字段定义,给出了严格的类型限定,调用者必须提供满足条件的实参值。
·后者参数表均是Any类型,接收参数时会自动将其转换到各字段要求的类型,如果转换失败则报错,实例化也会失败。
构造对象时,Julia会依照多态分发原则(后面介绍)在多个构造方法中自动选择。如果构造时提供的参数不满足所有方法的要求,便会报MethodError异常,例如:
julia> FooB() ERROR: MethodError: no method matching FooB() Closest candidates are: FooB(::Any, ::Float64) at REPL[2]:2 # 默认构造方法(有类型限定) FooB(::Any, ::Any) at REPL[2]:2 # 默认构造方法(无类型限定)
因为该例在对FooB实例化时,参数个数不符合任一构造方法的原型。
提示 出现异常时,Julia会在错误信息中的“Closest candidates are”之后给出可选的方法,开发者可以依此调整代码,或者按需自定义构造方法(后面会介绍)