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

Mor*_*ayJ 7 string coercion match perl6

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

method Str(Match:D: --> Str:D)
Run Code Online (Sandbox Code Playgroud)

我想我可以用Str($ match)来完成这个.它似乎将其转换为字符串,但我使用以下代码的字符串收到错误:

my $searchme = "rudolph";
my $match = $searchme ~~ /.*dol.*/;
say $match.WHAT;
my $test1 = Str($match);
say $test1.WHAT;
say $test1;
Run Code Online (Sandbox Code Playgroud)

随着输出:

(Match)
(Str)
Run Code Online (Sandbox Code Playgroud)

有错误:

无法找到方法'gist':没有方法缓存,并且在.code.tio第6行的块中没有.^ find_method

但是,如果我跑:

my $searchme = "rudolph";
my $match = $searchme ~~ /.*dol.*/;
say $match.WHAT;
my $test1 = $match.Str;
say $test1.WHAT;
say $test1;
Run Code Online (Sandbox Code Playgroud)

我没有得到任何错误,结果如下:

(Match)
(Str)
rudolph
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是我误解了它是如何工作的?

谢谢阅读.

rai*_*iph 8

我写这个作为答案,即使它实际上是一个错误的不完整的讨论,所以根本不是正常的SO票价.许多评论的替代方案似乎并不好.


这是一个错误.也许你只是golfed .

dd $test1;而不是say $test1;有助于它显示BOOTStr $test1 = (BOOTStr without .perl method).

基于此,我搜索了rakudo回购BOOTStr,导致了上述问题.

高尔夫球进一步导致:

say $ = Str(Match.new);
Run Code Online (Sandbox Code Playgroud)

请注意,这些都很好:

say Str(Match.new);
say $ = Int(Match.new);
say $ = Str(Date.new: '2015-12-31');
Run Code Online (Sandbox Code Playgroud)

它似乎是泄漏一些有关Rakudo/NQP/MoarVM引导程序的实现细节的组合; Match是一个NQP对象; Str()在那是不可思议的; 并将它分配给一个Scalar容器(这$是一个匿名的容器)使得这种不可见的东西可见.

如果我弄清楚的话,我会添加更多.