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)
这是一个错误还是我误解了它是如何工作的?
谢谢阅读.
我写这个作为答案,即使它实际上是一个错误的不完整的讨论,所以根本不是正常的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容器(这$是一个匿名的容器)使得这种不可见的东西可见.
如果我弄清楚的话,我会添加更多.