[::TValue = Mu, ::TKey = Str(Any)]
对于通过 postcircumfix:<{ }> 支持基于名称查找的类型(例如 Hash
和 Map
)的通用 role。它用于运算符中的类型检查,这些运算符期望找到要调用的特定方法。有关详细信息,请参见 下标。
%
sigil 将变量限制为执行 Associative
的对象,因此如果您想将其用于自己的类,则必须混合使用该 role。
;my := Whatever.new;# OUTPUT: «Type check failed in binding; expected Associative but got Whatever
请注意,我们在此处使用绑定 :=
,因为默认情况下 %
赋值期望右侧为 Hash
,因此赋值将尝试将其转换为哈希(也会失败)。但是,使用 Associative role
is Associative ;my := Whatever.new;
在语法上是正确的。
方法§
method of§
method of()
如上文定义所示,Associative
实际上是一个 参数化 role,它可以为键和值使用不同的类。如文档顶部所示,默认情况下它将键强制转换为 Str
,并为值使用非常通用的 Mu
。
my ;say .of; # OUTPUT: «(Mu)»
当使用特定类实例化 Associative
时,值是您使用的第一个参数
is Hash does Associative[Cool,DateTime] ;my := DateHash.new;say .of; # OUTPUT: «(Cool)»
method keyof§
method keyof()
返回用于 Associative role 的参数化键,默认情况下为强制转换为 Str
的 Any
。当您使用 Associative 的参数化版本时,这是用作第二个参数的类。
my ;.keyof; # OUTPUT: «(Str(Any))»
混合 Associative 的类应提供的方法§
如果您希望自己的类正确实现 Associative role,从而使用 {}
运算符根据键访问值,则需要提供这些方法。但是,它们不是必需的;另一方面,如果您只想让类的对象使用 {}
,则可以在不混合 Associative
role 的情况下实现它们。
method AT-KEY§
method AT-KEY(\key)
应返回给定键的值/容器。
;say What.new; # OUTPUT: «42»
method EXISTS-KEY§
method EXISTS-KEY(\key)
应返回一个 Bool
,指示给定键是否实际具有值。
方法 STORE§
method STORE(\values, :)
仅当您想支持
my is Foo = a => 42, b => 666;
绑定 Associative
角色实现的语法时,才应提供此方法。
应接受用于(重新)初始化对象的值,这些值可以由 Pair
或单独的键/值对组成。当首次在对象上调用该方法时,可选的命名参数将包含一个 True
值。应返回调用者。
另请参见§
有关可为 Associative
角色实现的其他方法的信息,请参见 用于关联式下标的方法。