最终答案
结合中解释的代码清理你的答案已经清理干净了下面的部分介绍了 Pepe Schwarz 在预期警报下面我们得到:
use java::util::zip::CRC32:from<Java>;
my $crc = CRC32.new();
for 'Hello, Java'.encode('utf-8').list {
$crc.update($_);
}
say $crc.getValue();
你的答案已经清理干净了
use v6;
use java::util::zip::CRC32:from<Java>;
my $crc = CRC32.new();
for 'Hello, Java'.encode('utf-8').list { # Appended `.list`
$crc.'method/update/(I)V'($_);
}
say $crc.getValue();
一个重要的变化是附加的.list
.
The 'Hello, Java'.encode('utf-8')
片段返回一个对象,autf8
。该对象仅向for
陈述。所以for
仅迭代一次,将对象传递给代码块update
行在其中。
如果只迭代一次就有意义update
线是.'method/update/([B)V'
,它映射到一个需要 8 位整数缓冲区的 Java 方法,这本质上是 Perl 6utf8
是。但是,这需要一些支持 Perl 6 代码(大概在核心编译器中)来编组(自动转换)Perl 6utf8
进入Javabuf[]
如果该代码曾经存在/工作过,那么当我使用最新的 Rakudo 进行测试时,它肯定无法工作。
但如果有人明智地附加一个.list
如上所示并更改代码块以匹配,事情就解决了。
首先,.list
结果在for
语句迭代一系列整数。
其次,和你一样,我调用了 Java 方法的 Integer arg 版本(.'method/update/(I)V'
)而不是原始的缓冲区参数版本,然后代码可以正常工作。 (这意味着从 Perl 6 返回的无符号 8 位整数的二进制表示utf8
object 要么已经是 Java 方法所期望的,要么是自动为您编组的。)
另一个需要改变的是from<java>
需要是from<Java>
根据您下面的评论 - 谢谢。
预期警报
截至 2015 年 1 月:
仅仅使用 Rakudo/NQP 的 JVM 后端(即在 JVM 上运行纯 P6 代码)仍然需要更多的强化才能正式宣布可供生产使用。 (这是整个 P6 生态系统今年预计将进行的全面强化的补充。)JVM 后端有望在 2015 年实现——它有望成为 Perl 6 首次正式发布的一部分,为 Perl 6 做好准备。今年的生产使用——但这在很大程度上取决于需求以及有更多的开发人员使用它并贡献补丁。
P6代码调用Java代码是额外的项目。 Pepe Schwarz 在过去几个月里在加快速度、学习代码库和登陆提交 https://github.com/rakudo/rakudo/commits/nom?author=peschwa。他已经实现了本答案开头所示的明显更好的短名称调用,并完成了更多用于 P6 和 Java 类型之间转换的封送逻辑,并且正在积极征求反馈和具体改进请求。