在列表中§

有关例程映射,请参阅上下文中的主要文档

multi method map(\SELF: &block)
multi        map(&code+values)

为了说明目的,此处包含了应用于列表的示例。

对于列表,它会对每个元素调用 &code,并将返回值收集到序列中并返回。这是延迟发生的,即仅在访问返回值时才会调用 &code。示例

say ('hello'122/742'world').map: { .^name } # OUTPUT: «(Str Int Rat Int Str)␤» 
say map *.Str.chars'hello'122/742'world'# OUTPUT: «(5 1 8 2 5)␤» 

map 检查代码对象的元数,并尝试向其传递尽可能多的参数

sub b($a$b{ "$a before $b" };
say <a b x y>.map(&b).join('');   # OUTPUT: «a before b, x before y␤»

一次迭代列表中的两个项目。

请注意,map 不会展平嵌入的列表和数组,因此

((12), <a b>).map({ .join(',')})

依次将 (1, 2)<a b> 传递给块,总共进行两次迭代,结果序列为 "1,2", "a,b"

如果 &codeBlock 循环移相器将被执行,循环控制语句将被视为循环控制流。请注意,return 在其定义的上下文中执行。它不是块的返回语句,而是周围的例程。使用 Routine 还可以处理循环控制语句和循环移相器。任何 Routine 特定的控制语句或移相器都将在该 Routine 的上下文中处理。

sub s {
    my &loop-block = {
        return # return from sub s 
    };
    say 'hi';
    (1..3).map: &loop-block;
    say 'oi‽' # dead code 
};
s 
# OUTPUT: «hi␤»

在供应中§

有关方法映射,请参阅上下文中的主要文档

method map(Supply:D: &mapper --> Supply:D)

返回一个新供应,该供应通过 &mapper 映射给定供应的每个值,并将其发送到新供应。

my $supplier = Supplier.new;
my $all      = $supplier.Supply;
my $double   = $all.map(-> $value { $value * 2 });
$double.tap(&say);
$supplier.emit(4);           # OUTPUT: «8»

在回溯中§

有关方法映射,请参阅上下文中的主要文档

multi method map(Backtrace:D: &block --> Seq:D)

它对每个元素调用 &block,并将返回值收集到序列中并返回。

此程序

sub inner { Backtrace.new.map({ say "{$_.file}{$_.line}" }); }
sub outer { inner}
outer;

结果为

SETTING::src/core.c/Backtrace.rakumod: 85
SETTING::src/core.c/Backtrace.rakumod: 85
test.raku: 1
test.raku: 2
test.raku: 3
test.raku: 1

在任意中§

有关例程映射,请参阅上下文中的主要文档

multi method map(\SELF: &block)
multi        map(&code+values)

map 将迭代调用者,并从调用者中应用代码对象的指定位置参数数量。代码对象返回的值将成为返回的 Seq 的元素。

:$label:$item 仅在内部有用,因为 for 循环会转换为 map:$label 采用现有的 Label 来标记 .map 的循环,而 :$item 控制迭代是在 (SELF,)(如果设置了 :$item)还是 SELF 上进行。

sub 形式中,它将应用 code 块到 values,后者将用作调用者。

具有 |cIterable:D \iterableHash:D \hash 作为签名的形式将因 X::Cannot::Map 而失败,并且主要用于捕获常见陷阱。

在已下沉的 for 语句中,由映射创建的 Seq 也会下沉

say gather for 1 {
    ^3 .map: *.take;
} # OUTPUT: «(0 1 2)␤» 

在这种情况下,gather 下沉 for 语句,下沉 Seq 的结果将迭代其元素,对它们调用 .take

在 HyperSeq 中§

有关方法映射,请参阅上下文中的主要文档

method map(HyperSeq:D: $matcher*%options)

HyperSeq 使用映射,通常通过将 hyper 应用于已存在的 Seq 来创建。

在 RaceSeq 中§

有关方法映射,请参阅上下文中的主要文档

method map(RaceSeq:D: $matcher*%options)

RaceSeq 使用映射,通常通过将 .race 应用于已存在的 Seq 来创建。