我试图在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
这是一个错误还是我误解了它的工作原理?
感谢阅读。
答案 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
容器($
是一个匿名容器),以使这种可见性可见。
如果我知道的话,我会添加更多。