构造函数[1]是构造新对象,即新复合类型实例的函数。构造类型对象:
type Foo bar baz end julia> foo = Foo(1,2) Foo(1,2) julia> foo.bar 1 julia> foo.baz 2
递归数据结构 ,尤其是自引用的数据结构,常需要先构造为非完整状态,再按步骤将其完善。我们有时也可能希望用更少或不同类型的参数更方便的构造对象。Julia 的构造函数可以让包括这些在内的各种需求得到满足。
[1] :关于命名:尽管“构造函数”通常被用来描述创建新对象的函数,它也经常被滥用于特定的构造方法。通常情况下,可以很容易地从上下文推断出到底是“构造函数”还是“构造方法”。
构造函数与 Julia 中的其它函数一样,它的行为取决于它全部方法的行为的组合。因此,你可以通过定义新方法来给构造函数增加新性能。下例给 Foo
添加了新构造方法,仅输入一个参数,将该参数值赋给 bar
和 baz
域:
Foo(x) = Foo(x,x) julia> Foo(1) Foo(1,1)添加
Foo
的零参构造方法,给 bar
和 baz
域赋默认值:
Foo() = Foo(0) julia> Foo() Foo(0,0)这种追加的构造方法被称为 外部 构造方法。它仅能通过提供默认值的方式,调用其它构造方法来构造实例。
内部 构造方法与外部构造方法类似,但有两个区别:
new
函数,来构造声明块的类型的对象
例如,要声明一个保存实数对的类型,且第一个数不大于第二个数:
type OrderedPair x::Real y::Real OrderedPair(x,y) = x > y ? error("out of order") : new(x,y) end仅当
x <= y
时,才会构造 OrderedPair
对象:
julia> OrderedPair(1,2) OrderedPair(1,2) julia> OrderedPair(2,1) ERROR: out of order in OrderedPair at none:5
所有的外部构造方法,最终都会调用内部构造方法。
当然,如果类型被声明为 immutable
,它的构造函数的结构就不能变了。这对判断一个类型是否应该是 immutable 时很重要。