Perl 6类方法返回正则表达式报错:无法访问对象属性求解决
解决Perl 6正则中无法访问对象属性的问题
我明白刚学Perl 6类时碰到这种问题的困惑,你遇到的编译错误,核心原因是Perl 6的正则表达式有独立的作用域,默认无法直接访问对象的属性。下面给你两种简单可行的解决办法:
方法一:先把属性值存到方法局部变量中
先在reg方法里将$!str赋值给一个局部变量,再在正则里使用这个变量——因为局部变量的作用域能被正则的闭包捕获:
class TEST { has Str $.str; method reg { my $str = $!str; # 把属性值转存到方法内的局部变量 return rx/ << <[abc]> * $str <!before foo> /; } } my $var = TEST.new(str => 'baz'); say $var.reg;
方法二:用正则插值语法<{ ... }>
Perl 6支持在正则中嵌入Perl代码块,用<{ }>包裹的代码会在正则编译时执行,并且能直接访问当前方法的作用域(包括对象属性):
class TEST { has Str $.str; method reg { return rx/ << <[abc]> * <{ $!str }> <!before foo> /; } } my $var = TEST.new(str => 'baz'); say $var.reg;
为什么原来的代码会报错?
Perl 6里的正则表达式本质是一种特殊的方法,它们拥有自己的作用域上下文,默认情况下无法直接引用外部方法(也就是reg方法)中的对象属性$!str,所以编译器会提示属性不可用。
内容的提问来源于stack exchange,提问作者Eugene Barsky
相关产品推荐
相关产品推荐

