Julia语言程序设计
上QQ阅读APP看书,第一时间看更新

6.5.4 单例复合类型

没有任何成员字段的不可变复合类型会成为单例(Singleton),即以其为基础创建的任意对象实际都是一样的,没有区别。换言之,单例类型有且仅有一个实例对象。例如:


julia> struct NoFields1                         # 声明空类型 NoFields1
       end

julia> struct NoFields2                         # 声明空类型 NoFields2
       end

对创建NoFields1的两个对象进行对比:


julia> NoFields1() === NoFields1()
true

可见两者是“完全相同”的。显然,对于NoFields2类型也同样如此。

但是,不同名的struct单例是不同的对象,即:


julia> NoFields1() === NoFields2()     # 不满足完全不同的要求
false

julia> NoFields1() == NoFields2()      # 内容虽然都是空的,但却不同
false

其实这点不难理解,类型名不同所以对象不同;而类型名相同时,既然两个对象都是零字段,自然在对比时内容也是相同的。

但需注意的是,被mutable关键字修饰的空字段的可变复合类型是不会成为单例类型的,例如:


julia> mutable struct NoMember1 end

julia> NoMember1() === NoMember1()
false

julia> NoMember1() == NoMember1()
false

虽然NoMember1的两个对象类型一致而且都是零字段,但却不是相同的对象,甚至都不相等,这点需要特别注意。