role Associative[::TValue = Mu, ::TKey = Str(Any)] { }

对于通过 postcircumfix:<{ }> 支持基于名称查找的类型(例如 HashMap)的通用 role。它用于运算符中的类型检查,这些运算符期望找到要调用的特定方法。有关详细信息,请参见 下标

% sigil 将变量限制为执行 Associative 的对象,因此如果您想将其用于自己的类,则必须混合使用该 role。

class Whatever {};
my %whatever := Whatever.new;
# OUTPUT: «Type check failed in binding; expected Associative but got Whatever 

请注意,我们在此处使用绑定 :=,因为默认情况下 % 赋值期望右侧为 Hash,因此赋值将尝试将其转换为哈希(也会失败)。但是,使用 Associative role

class Whatever is Associative {};
my %whatever := Whatever.new;

在语法上是正确的。

方法§

method of§

method of()

如上文定义所示,Associative 实际上是一个 参数化 role,它可以为键和值使用不同的类。如文档顶部所示,默认情况下它将键强制转换为 Str,并为值使用非常通用的 Mu

my %any-hash;
say %any-hash.of# OUTPUT: «(Mu)␤»

当使用特定类实例化 Associative 时,值是您使用的第一个参数

class DateHash is Hash does Associative[Cool,DateTime{};
my %date-hash := DateHash.new;
say %date-hash.of# OUTPUT: «(Cool)␤»

method keyof§

method keyof()

返回用于 Associative role 的参数化键,默认情况下为强制转换为 StrAny。当您使用 Associative 的参数化版本时,这是用作第二个参数的类。

my %any-hash;
%any-hash.keyof# OUTPUT: «(Str(Any))␤»

混合 Associative 的类应提供的方法§

如果您希望自己的类正确实现 Associative role,从而使用 {} 运算符根据键访问值,则需要提供这些方法。但是,它们不是必需的;另一方面,如果您只想让类的对象使用 {},则可以在不混合 Associative role 的情况下实现它们。

method AT-KEY§

method AT-KEY(\key)

应返回给定键的值/容器。

class What { method AT-KEY(\key{ 42 }};
say What.new{33}# OUTPUT: «42␤» 

method EXISTS-KEY§

method EXISTS-KEY(\key)

应返回一个 Bool,指示给定键是否实际具有值。

方法 STORE§

method STORE(\values:$INITIALIZE)

仅当您想支持

my %h is Foo = => 42=> 666;

绑定 Associative 角色实现的语法时,才应提供此方法。

应接受用于(重新)初始化对象的值,这些值可以由 Pair 或单独的键/值对组成。当首次在对象上调用该方法时,可选的命名参数将包含一个 True 值。应返回调用者。

另请参见§

有关可为 Associative 角色实现的其他方法的信息,请参见 用于关联式下标的方法

类型图§

Associative 的类型关系
raku-type-graph Associative Associative Mu Mu Any Any Any->Mu Telemetry Telemetry Telemetry->Any Telemetry::Period Telemetry::Period Telemetry::Period->Associative Telemetry::Period->Telemetry Positional Positional Iterable Iterable IO::Path::Parts IO::Path::Parts IO::Path::Parts->Associative IO::Path::Parts->Any IO::Path::Parts->Positional IO::Path::Parts->Iterable Pair Pair Pair->Associative Pair->Any QuantHash QuantHash QuantHash->Associative Cool Cool Cool->Any Map Map Map->Associative Map->Iterable Map->Cool PseudoStash PseudoStash PseudoStash->Map Hash Hash Hash->Map Baggy Baggy Baggy->QuantHash Setty Setty Setty->QuantHash Stash Stash Stash->Hash Bag Bag Bag->Any Bag->Baggy Mixy Mixy Mixy->Baggy BagHash BagHash BagHash->Any BagHash->Baggy Set Set Set->Any Set->Setty SetHash SetHash SetHash->Any SetHash->Setty

展开上面的图表