我正在尝试在对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在过去几个月中发布的版本中包含一个错误的修复程序,该错误意味着在常规返回处理中ProxyScalar的处理不同。 Proxy并未在应有的位置剥离;现在确实是。

关于raku - Perl6使用代理触发属性访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53990118/

10-15 22:31