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

Posted

技术标签:

【中文标题】在 perl6 中将匹配对象转换为字符串【英文标题】:Converting match object to string in perl6 【发布时间】:2019-01-05 08:34:58 【问题描述】:

我试图。匹配对象上的方法 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 in 在 .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

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

感谢阅读。

【问题讨论】:

这是一个错误。也许您刚刚打了高尔夫球this。 dd $test1; 而不是 say $test1; 很有帮助,因为它显示 BOOTStr $test1 = (BOOTStr without .perl method)。基于此,我searched the rakudo repo for BOOTStr 导致了上述问题。我会尝试进一步打高尔夫球,但我想我会在此期间发表此评论。 顺便说一句,我通常使用~ 来强制匹配字符串。 my $text = ~$match 【参考方案1】:

我将其写为答案,尽管它实际上是对错误的不完整讨论,因此根本不是正常的 SO 票价。许多 cmets 的替代方案似乎并不好。


这是一个错误。也许你刚刚打了高尔夫球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 容器($ 是一个匿名容器),从而使这种不稳定可见。

当/如果我弄明白了,我会添加更多。

【讨论】:

太好了,谢谢。为我清除它。我会假设它是那个错误而不是发布它。干杯

以上是关于在 perl6 中将匹配对象转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中将字符串转换为文件对象?

在python中将对象数据类型转换为字符串问题

如何在Javascript中将字符串转换为对象? [复制]

在 PHP 中将对象转换为 JSON 并将 JSON 转换为对象,(像 Gson for Java 之类的库)

在 Angular 7 中将 Json 转换为对象

在 Java 中将字符串转换为日历对象