Julia语言程序设计
上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”之后给出可选的方法,开发者可以依此调整代码,或者按需自定义构造方法(后面会介绍)