raku - Perl6使用代理触发属性访问

标签 raku

我正在尝试在对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/

相关文章:

raku - Raku 在编译时执行哪些类型检查?将来可能会改变吗?

macros - 宏定义中的"Too few positionals"

perl - 您如何自定义文本分段以在有向图之间不中断?

raku - 如何使用raku IO.lines.race构造跳过文本文件的前几行

syntax - 内省(introspection)模块/类/等的替代语法

class - 方法在Perl 6中返回正则表达式?

overloading - 无法在Raku中重载>>运算符

raku - 如何将 url 转换为 IP 地址

raku - perl6/rakudo : Unable to parse postcircumfix:sym<( )>

raku - 为什么 perl6 repl 不区分两个不同的类?