这样不行吗?
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)
}
我得到
$ 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
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
将找到的签名与每个建议的签名进行比较,会发现一个近似匹配:
(Buf:D: Int:D $got, *%_)
唯一的区别是Buf:D
和Buf:U
的东西(称为invocant marker
)在签名的前面。它指定了调用者(可以调用方法的对象/对象)。它是可选的,默认情况下允许在对象和类上调用方法。大多数情况下,调用标记用于指定方法是只允许在类型对象(例如Blob.allocate)上调用,还是只允许在具体对象(例如Blob.gist)上调用。Buf:D
表示D定义的Buf
类型对象,Buf:U
表示U未定义的Buf
类型对象。
所以从上面我们可以知道代码试图在一个类型对象上调用push
,所以$data2
是未定义的。将my Buf $data2;
更改为my Buf $data2 .= new;
可以修复此问题。