将元素压入Buf

  • 本文关键字:Buf 元素 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)
}             

我得到

$ 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:DBuf:U的东西(称为invocant marker)在签名的前面。它指定了调用者(可以调用方法的对象/对象)。它是可选的,默认情况下允许在对象和类上调用方法。大多数情况下,调用标记用于指定方法是只允许在类型对象(例如Blob.allocate)上调用,还是只允许在具体对象(例如Blob.gist)上调用。Buf:D表示D定义的Buf类型对象,Buf:U表示U未定义的Buf类型对象。

所以从上面我们可以知道代码试图在一个类型对象上调用push,所以$data2是未定义的。将my Buf $data2;更改为my Buf $data2 .= new;可以修复此问题。

最新更新