怎么在 Perl 6 中自定义存取器?

How does one write custom accessor methods in Perl6?


我有一个类:

class Wizard {
    has Int $.mana is rw;
}

我可以这样做:

my Wizard $gandalf .= new;
$gandalf.mana = 150;

我想在不放弃使用$gandalf.mana = 150; 的情况下, 在 setter里面做一些检查。换句话说, 我不想这样写: $gandalf.setMana(150)。 如果程序尝试设置一个负值的话, 就退出。

class Wizard {
    has Int $!mana;

    method mana() is rw {
        return Proxy.new:
            FETCH => sub ($) { return $!mana },
            STORE => sub ($, $mana) {
                die "It's over 9000!" if ($mana // 0) > 9000;
                $!mana = $mana;
            }
    }
    }

my Wizard $gandalf .= new;
say $gandalf.mana;
$gandalf.mana = 150;
say $gandalf.mana;

Pxoxy是一种拦截对存储进行读写调用, 并做一些非默认行为的方式。在解析像 $gandalf.mana = $gandalf.mana + 5 这种表达式的时候, Perl 6 会自动调用 FETCHSTORE 方法。

class Baby {
  has Int $.mana; # use . instead of ! for better `.perl` representation

  # overwrite the method the attribute declaration added
  method mana () is rw {
    Proxy.new(
      FETCH => -> $ { $!mana },
      STORE => -> $, Int $new {
        die 'invalid mana' unless $new >= 0; # placeholder for a better error
        $!mana = $new
      })
  }
}

my Baby $baby .= new;
$baby.mana = 9;
say $baby.mana;
$baby.mana = -9;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • 2009 有用的和有意思的循环 让我们来看一个基本的例子. 这是一个最简单清晰的语法的例子.在这并没有使用括号来包...
    焉知非鱼阅读 606评论 0 0
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 简书 3.6 Customizing the...
    SnailTyan阅读 902评论 0 3
  • 此间佳节昏沉沉,无风无雨少行人。 贩夫走卒多可爱,自吹自擂博口才。 遥望远方故乡地,亲朋好友可曾聚? 身在客家独一...
    黄小邪师傅阅读 332评论 1 0
  • 文/月明红红 风起萧萧一地秋,天高云淡已无忧 笔耕添酒诗篇咏,一片光阴付水流 时光穿梭中又是一季秋的来临,在这丰饶...
    月明红红阅读 621评论 5 11