我正在尝试在对perl6 Class属性的写访问权上实现一个触发器。我无法找出错误的原因...
...我是从How does one write custom accessor methods in 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
这种行为似乎已经改变-该代码在6月18日正常工作-但我想确保自己能顺应最新的想法。
任何帮助将不胜感激!
最佳答案
要么删除return
:
method value( Real $newval? ) is rw {
Proxy.new:
FETCH => sub ($) { $!value },
STORE => sub ($, $newval) { $!value = $newval },
}
或者,如果您确实想明确表示,则使用
return-rw
:method value( Real $newval? ) is rw {
return-rw Proxy.new:
FETCH => sub ($) { $!value },
STORE => sub ($, $newval) { $!value = $newval },
}
问题是
return
会剥离任何项目容器,因此仅将is rw
放在method
上是不够的。关于为什么发布的代码曾经起作用,但现在却不再起作用:Rakudo在过去几个月中发布的版本中包含一个错误的修复程序,该错误意味着在常规返回处理中
Proxy
与Scalar
的处理不同。 Proxy
并未在应有的位置剥离;现在确实是。关于raku - Perl6使用代理触发属性访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53990118/