class ValueObjAt is ObjAt { }

ObjAt 的子类,应该用来指示一个类生成的是值类型对象,换句话说,在初始化后,这些对象是不可变的。

my %h = => 42;        # mutable Hash 
say %h.WHICH;           # OUTPUT: «ObjAt.new("Hash|1402...888")␤» 
 
my %m is Map = => 42# immutable Map 
say %m.WHICH;           # OUTPUT: «ValueObjAt.new("Map|AAF...09F61F")␤»

如果你创建一个应该被视为值类型的类,你应该向该类添加一个返回 ValueObjAt 对象的 WHICH 方法,例如

class YourClass {
    has $.foo;  # note these are not mutable 
    has $.bar;
 
    method WHICH() {
        ValueObjAt.new("YourClass|$!foo|$!bar");
    }
}

请注意,通常的做法是始终以对象名称开头,后跟 "|",来开始标识字符串。这是为了防止与可能生成类似字符串值的其它类混淆:类名应该足以作为防止冲突的差异化因素。

类型图§

ValueObjAt 的类型关系
raku-type-graph ValueObjAt ValueObjAt ObjAt ObjAt ValueObjAt->ObjAt Mu Mu Any Any Any->Mu ObjAt->Any

展开上面的图表