gpt4 book ai didi

raku - 将来自子集中正则表达式的命名捕获放入签名中的变量中

转载 作者:行者123 更新时间:2023-12-03 18:34:20 25 4
gpt4 key购买 nike

考虑

subset MySubset of Str where * ~~ /^ \d $<interesting> = ( \d+ ) $/;

现在我想在我的签名中使用子集作为类型,但是通过解包将捕获的部分放入变量中,有点像
sub f( MySubset $( :$interesting ) )
{
say $interesting;
}

f( "12345678" ); # should say 2345678

这当然行不通。甚至有可能做到这一点吗?

最佳答案

子签名解包是将一个值转换为 Capture 并与之匹配。

class Point {
has ( $.x, $.y );
}

my ( :$x, :$y ) := Point.new( x => 3, y => 4 ).Capture;

say "[$x,$y]"; # [3,4]

由于 Str 没有名为 $.interesting 的公共(public)属性,因此它不会匹配。

子集只是额外的代码,用于比其他方式更全面地检查值。它不会将值转换为新类型。

如果您使用 $<interesting> ,它更有可能起作用。

sub f( MySubset )
{
say $<interesting>;
}

当然,由于 block 有自己的 $/ ,这也不起作用。

虽然将信息从子集传递给签名可能会很好,但我不知道该怎么做。

附带说明一下, where 已经进行了智能匹配,因此在其中使用 ~~ 是一个非常糟糕的主意。

这基本上就是您的子集的工作方式:

"12345678" ~~ ( * ~~ /…/ )

在这种特殊情况下,您可以只使用 .substr
sub f( MySubset $_ )    {
.substr(1)
}

关于raku - 将来自子集中正则表达式的命名捕获放入签名中的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61955242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com