将元素推送到 Buf

zen*_*nix 5 raku

这不应该有效吗?

use v6;

my $data1 = Buf.new(1, 2, 3);
my Buf $data2;

my $n = $data1.bytes;

for ^$n
{
  my $ch = $data1.shift;
  $data2.push($ch)
}             
Run Code Online (Sandbox Code Playgroud)

我越来越

$ raku bufpush.raku
Cannot resolve caller push(Buf:U: Int:D); none of these signatures matches:
    (Buf:D: int $got, *%_)
    (Buf:D: Int:D $got, *%_)
    (Buf:D: Mu:D $got, *%_)
    (Buf:D: Blob:D $buf, *%_)
    (Buf:D: **@values, *%_)
  in block <unit> at bufpush.raku line 11
Run Code Online (Sandbox Code Playgroud)

Pat*_*ker 5

Cannot resolve caller push(Buf:U: Int:D); none of these signatures matches:
    (Buf:D: int $got, *%_)
    (Buf:D: Int:D $got, *%_)
    (Buf:D: Mu:D $got, *%_)
    (Buf:D: Blob:D $buf, *%_)
    (Buf:D: **@values, *%_)
  in block <unit> at bufpush.raku line 11
Run Code Online (Sandbox Code Playgroud)

将找到的签名与每个建议的签名进行比较,结果显示近似匹配:

(Buf:D: Int:D $got, *%_)
Run Code Online (Sandbox Code Playgroud)

唯一的区别是签名前面的Buf:DvsBuf:U东西(称为)。invocant marker它指定调用者(可以调用该方法的对象/事物)。它是可选的,默认情况下允许调用对象和类上的方法。大多数情况下,调用者标记用于指定是否只允许在类型对象(例如Blob.allocate)或具体对象(例如Blob.gist)上调用该方法。Buf:D表示定义Buf对象,Buf:U表示未定义类型Buf对象。

所以从上面我们可以知道代码试图调用push类型对象,所以$data2是未定义的。更改my Buf $data2;my Buf $data2 .= new;可解决该问题。