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

时间:2018-07-28 11:56:44

标签: string match perl6 coercion

我试图在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

这是一个错误还是我误解了它的工作原理?

感谢阅读。

1 个答案:

答案 0 :(得分:8)

尽管这实际上是对错误的不完全讨论,但我还是以此为答案,所以根本不是正常的SO票价。大量评论的替代方案似乎并不更好。


这是一个错误。也许您刚打this

dd $test1;而不是say $test1;,因为它显示BOOTStr $test1 = (BOOTStr without .perl method)

基于我searched the rakudo repo for 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容器($是一个匿名容器),以使这种可见性可见。

如果我知道的话,我会添加更多。