use java::util::zip::CRC32:from<java>;
my $crc = CRC32.new();
for 'Hello, Java'.encode('utf-8') {
$crc.'method/update/(B)V'($_);
}
say $crc.getValue();
可悲的是,这不起作用
Method 'method/update/(B)V' not found for invocant of class 'java.util.zip.CRC32'
此代码可在以下链接中找到。这是我能找到的唯一例子
最佳答案
最终答案
将下面您的答案清理部分中解释的代码清理与下面的期望警报部分中提到的 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
.'Hello, Java'.encode('utf-8')
片段返回一个对象,一个 utf8
.该对象只返回一个值(本身)给for
。陈述。所以for
只迭代一次,将对象传递给带有 update
的代码块行在里面。如果
update
只迭代一次可能是有意义的。行是 .'method/update/([B)V'
,它映射到需要 8 位整数缓冲区的 Java 方法,这本质上是 Perl 6 utf8
是。但是,这需要一些支持 Perl 6 的代码(可能在核心编译器中)来编码(自动转换)Perl 6 utf8
转换成 Java buf[]
如果该代码曾经存在/工作过,那么当我使用最新的 Rakudo 进行测试时,它肯定不会工作。但是,如果一个人附加一个明智的
.list
如上所示并更改代码块以匹配,事情就解决了。一、
.list
结果 for
迭代一系列整数的语句。其次,像您一样,我调用了 Java 方法的整数 arg 版本(
.'method/update/(I)V'
)而不是原始缓冲区 arg 版本,然后代码可以正常工作。 (这意味着从 Perl 6 utf8
对象返回的无符号 8 位整数的二进制表示要么已经完全符合 Java 方法的预期,要么自动为您编码。)另一个需要的更改是
from<java>
需要from<Java>
根据您在下面的评论 - 谢谢。预期警报
截至 2015 年 1 月:
关于jvm - 如何从 perl6 调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27156329/