在数组中§

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

multi method push(Array:D: **@values is raw --> Array:D)
multi method push(Array:D: \value --> Array:D)
multi method push(Array:D: Slip \values --> Array:D)

将提供的 value 或 values 添加到数组的末尾,并返回修改后的数组。如果任何参数是 Slip,则方法 push 将添加由参数的 迭代器 产生的值。如果调用数组或 Slip 是惰性的,则会引发异常。

示例

my @foo = <a b c>;
@foo.push: 'd';
say @foo;                   # OUTPUT: «[a b c d]␤»

请注意,push 不会尝试扁平化其参数列表。如果您将数组或列表作为要 push 的内容传递,它将变为一个额外的元素

my @a = <a b c>;
my @b = <d e f>;
@a.push: @b;
say @a.elems;               # OUTPUT: «4␤» 
say @a[3].join;             # OUTPUT: «def␤»

仅当您将多个值作为单独的参数或在 Slip 中提供时,才会将它们添加到数组中

my @a = '1';
say @a.push: 'a''b';       # OUTPUT: «[1 a b]␤» 
my @c = <E F>;
say @a.push: @c.Slip;        # OUTPUT: «[1 a b E F]␤»

如果您想附加由单个非滑动 Iterable 产生的多个值,请参阅 方法 append

在哈希中§

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

method push(Hash:D: +new)

new 元素添加到哈希中,其语义与哈希赋值相同,但有三个例外

  • 哈希不会首先清空,即不会删除旧对。

  • 如果哈希中已存在某个键,并且相应的值是 Array,则新值将推送到数组上(而不是替换它)。

  • 如果哈希中已存在某个键,并且相应的值不是 Array,则旧值和新值都将放在数组中,取代旧值。

示例

my %h  = => 1;
%h.push: (=> 1);              # a => [1,1] 
%h.push: (=> 1xx 3 ;        # a => [1,1,1,1,1] 
%h.push: (=> 3);              # a => [1,1,1,1,1], b => 3 
%h.push('c' => 4);              # a => [1,1,1,1,1], b => 3, c => 4 
push %h'd' => 5;              # a => [1,1,1,1,1], b => 3, c => 4, d => 5

请注意,参数列表中的文字对可能会被解释为 命名参数,因此不会出现在 Hash

my %h .= push(=> 6);
say %h.raku# OUTPUT: «{}␤»

使用相应的 子例程 来捕获此类错误

push my %h=> 7;
CATCH { default { put .message } };
# OUTPUT: «Unexpected named argument 'f' passed␤»

另请注意,push 可用作哈希初始化期间赋值的替代,非常有用。以倒排索引为例

my %wc = 'hash' => 323'pair' => 322'pipe' => 323;
(my %inv).push: %wc.invert;
say %inv;                     # OUTPUT: «{322 => pair, 323 => [pipe hash]}␤»

请注意,这样的初始化也可以写成

my %wc = 'hash' => 323'pair' => 322'pipe' => 323;
my %inv .= push: %wc.invert;

注意:append 相比,push 会按原样添加给定值,而 appendslip 添加给定值

my %ha = :a[42, ]; %ha.push: "a" => <a b c a>;
say %ha# OUTPUT: «{a => [42 (a b c a)]}␤» 
 
my %hb = :a[42, ]; %hb.append: "a" => <a b c a>;
say %hb# OUTPUT: «{a => [42 a b c a]}␤»

在任意中§

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

multi method push(Any:U \SELF: |values --> Positional:D)

方法 push 是为未定义的调用者定义的,并且允许自动将未定义的值初始化为一个空的 Array,除非未定义的值已经实现了 Positional。然后,提供的参数将被推送到新创建的 Array 中。

my %h;
say %h<a>;     # OUTPUT: «(Any)␤»      <-- Undefined 
%h<a>.push(1); # .push on Any 
say %h;        # OUTPUT: «{a => [1]}␤» <-- Note the Array

在角色 Buf 中§

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

method push$elems )

在缓冲区的末尾添加元素。

my $ = Buf.new11235 );
$.push8 );
say $.raku# OUTPUT: «Buf.new(1,1,2,3,5,8)␤»

在 IterationBuffer 中§

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

method push(IterationBuffer:D: Mu \value)

IterationBuffer 的末尾添加给定值,并返回给定值。

在 Nil 中§

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

method push(*@)

警告用户他们尝试将内容推送到 Nil 或派生类型对象。

在独立例程中§

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

multi push(\a**@b is raw)
multi push(\a, \b)

对第一个参数调用方法 push,传递剩余参数。方法 push 应该将提供的值添加到集合或其部分的末尾。有关此子例程间接引用的示例,请参阅Hash 方法的文档。

方法 push 应该扁平化所有类型为 Slip 的参数。因此,如果你想为新集合类型实现一个符合要求的方法,它应该表现得好像它的签名只是

multi method push(::?CLASS:D: **@values is raw --> ::?CLASS:D)

如果新类型实现了 Positional 角色,则通过默认基类提供自动激活到新类型的实例。如果新类型不是 Positional,则可以通过添加具有类似签名的多方法来支持自动激活,例如

multi method push(::?CLASS:U: **@values is raw --> ::?CLASS:D)