在 Supplier 中§

请参见主要文档 在上下文中 了解方法 done

method done(Supplier:D:)

对所有具有一个回调的 tap 调用 done 回调。

my $supplier = Supplier.new;
my $supply   = $supplier.Supply;
$supply.tap(-> $v { say $v }done => { say "no more answers" });
$supplier.emit(42);
$supplier.done;

将输出

42
no more answers

在独立例程中§

请参见主要文档 在上下文中 了解子例程 done

sub done(--> Nil)

如果在任何供应或反应块之外使用,则会抛出异常 done without supply or react。在 Supply 块内,它将指示供应不再发出任何内容。另请参见 方法 done 的文档

my $supply = supply {
    for 1 .. 3 {
        emit($_);
    }
    done;
}
$supply.tap-> $v { say "Second : $v" }done => { say "No more" });
# OUTPUT: «Second : 1␤Second : 2␤Second : 3␤No More␤» 

传递给 done 命名参数的块将在 supply 块内调用 done 时运行。

从 Rakudo 编译器的 2021.06 版本开始,还可以使用 done 提供一个值

sub done($value --> Nil)

指定的 value 将首先被 emit,然后调用无参数的 done

my $supply = supply {
    for 1 .. 3 {
        emit($_);
    }
    done 42;  # same as: emit 42; done 
}
$supply.tap: -> $v { say "Val: $v" }done => { say "No more" }
# OUTPUT: OUTPUT: «Val: 1␤Val: 2␤Val: 3␤Val: 42␤No More␤»