在Perl6中将匹配对象转换为字符串

7

我试图将perl6中的匹配对象转换为字符串。匹配对象上的方法Str定义如下:

method Str(Match:D: --> Str:D)

我认为可以使用Str($match)来完成此操作。它似乎将其转换为字符串,但是在使用以下代码的字符串时出现错误:

my $searchme = "rudolph";
my $match = $searchme ~~ /.*dol.*/;
say $match.WHAT;
my $test1 = Str($match);
say $test1.WHAT;
say $test1;

使用下面的输出:

(Match)
(Str)

出现以下错误:

找不到方法'gist':没有方法缓存,也没有在代码块中找到.^find_method,位于.code.tio的第6行

但是,如果我运行:

my $searchme = "rudolph";
my $match = $searchme ~~ /.*dol.*/;
say $match.WHAT;
my $test1 = $match.Str;
say $test1.WHAT;
say $test1;

我没有收到任何错误信息,结果如下:
(Match)
(Str)
rudolph

这是一个Bug还是我对它的工作原理存在误解?感谢您的阅读。

2
这是一个bug。也许你只是像golfed this一样。使用dd $test1;而不是say $test1;有助于显示BOOTStr $test1 = (BOOTStr without .perl method)。基于此,我在rakudo repo中搜索了BOOTStr,并找到了上述问题。我将尝试进一步压缩它,但同时想发布此评论。 - raiph
顺便提一下,我通常使用~来将匹配强制转换为字符串。my $text = ~$match - donaldh
1个回答

8

尽管这实际上只是一个未完成的讨论bug,不是常规的SO内容,但我会将其写成答案。 大量评论的替代方案似乎并不更好。


这是一个bug。也许你只是在this上打高尔夫球。

使用dd $test1;而不是say $test1;会有帮助,因为它显示了BOOTStr $test1 = (BOOTStr without .perl method)

基于此,我搜索了rakudo repo BOOTStr,这就导致了上述问题。

进一步的高尔夫球练习会导致:

say $ = Str(Match.new);

请注意,这些都是可以的:
say Str(Match.new);
say $ = Int(Match.new);
say $ = Str(Date.new: '2015-12-31');

看起来是泄漏了一些关于Rakudo/NQP/MoarVM引导的实现细节; Match 是一个NQP对象; 对其进行Str()操作有点奇怪; 并将其分配给一个Scalar容器(其中$是匿名的),使得这种不正常变得可见。
如果我弄明白了,我会添加更多信息。

1
太好了,谢谢。这让我清楚了。我会假设那是个bug,不会发布它。干杯! - MorayJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接