我试图实现对perl6 Class属性的写访问的触发器.我无法弄清楚错误的原因......
...我从如何在Perl6中编写自定义访问器方法获得了这个概念?
1 #!/usr/bin/env perl6
2
3 class MeasureSP {
4
5 has Real $!value;
6 has Str $.units;
7
8 submethod BUILD( :$!value, :$!units ) {}
9
10 method value( Real $newval? ) is rw {
11 return Proxy.new:
12 FETCH => sub ($) { $!value },
13 STORE => sub ($, $newval) { $!value = $newval },
14 }
15
16 }
17 my MeasureSP $m-sp = MeasureSP.new( value => 23, units => 'metres' );
18 say $m-sp.units; #metres
19 say $m-sp.value; #23
20 $m-sp.value = 1;
21 # Cannot assign to a readonly variable or a value
22 #in block <unit> at ./retry.p6 line 20
Run Code Online (Sandbox Code Playgroud)
这种行为似乎已经改变了 - 这段代码在6月18日恢复正常 - 但我想确保我与最新思路保持同步.
任何帮助将非常感谢!
Jon*_*ton 13
删除return:
method value( Real $newval? ) is rw {
Proxy.new:
FETCH => sub ($) { $!value },
STORE => sub ($, $newval) { $!value = $newval },
}
Run Code Online (Sandbox Code Playgroud)
或者使用,return-rw如果你真的想要明确:
method value( Real $newval? ) is rw {
return-rw Proxy.new:
FETCH => sub ($) { $!value },
STORE => sub ($, $newval) { $!value = $newval },
}
Run Code Online (Sandbox Code Playgroud)
问题是return将剥离任何物品容器,所以只是穿上is rw它method是不够自己的.
至于为什么用张贴代码工作,但不再做:Rakudo释放在过去几个月中已包括了这意味着一个bug修复Proxy比被区别对待Scalar的程序返回的处理.该Proxy不是在的地方就应该被剥夺; 现在可靠的是.