Perl6使用Proxy来触发属性访问

p6s*_*eve 6 perl6

我试图实现对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 rwmethod是不够自己的.

至于为什么用张贴代码工作,但不再做:Rakudo释放在过去几个月中已包括了这意味着一个bug修复Proxy比被区别对待Scalar的程序返回的处理.该Proxy不是在的地方就应该被剥夺; 现在可靠的是.