上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的两个对象类型一致而且都是零字段,但却不是相同的对象,甚至都不相等,这点需要特别注意。