Perl 6 - 类中的 . twigils

Perl 6中的 .! twigil 是什么?

. twigil 的意思是"这是类公用的", ! twigil 的意思是“这是类私有的”, 只能用在类的内部。

class ScoreKeeper {
    has @.options;
    has %!player-points;
}

普通的符号表明了词法作用域或包作用域, 但是 twigils 就像是 sigils 的兄弟, 表明了不同的作用域, 它影响了变量的作用域。.! 是二级 sigils

属性存在于每个类的实例中, 在类的内部, 可以直接使用 !访问到实例的属性:

class Point {
    has $.x;
    has $.y;
    method Str() {
        "($!x, $!y)"
    }
}

那么 . twigil! twigil 之间有什么关系呢?下面看一个例子:

use v6;

class Point {
    has $.x;
    has $.y;

    method Str() {
        # 注意这次我们使用 . 而非 !
        "\$.x 等价于 self.x()".say  if $.x == self.x();
        "\$.y 等价于 self.y()".say  if $.y == self.y();
    }

    method print() {
        say self.x(); # 调用实例的名为 x 的方法
        say self.y(); # 调用实例的名为 y 的方法
    }
}

my $point = Point.new(x => 10, y => 20);
$point.Str;   
$point.print; 

会输出:

$.x 等价于 self.x()
$.y 等价于 self.y()
10
20

注意到, 属性被声明为 $.x$.y, 但是在类的内部仍旧能通过 $!x$!y来访问属性。这是因为在 Perl 6 中所有的属性都是私有的并且在类中可以通过 $!attribute-name直接访问这些属性。 Perl 6 可以为你自动生成存取方法

公共属性拥有 . twigil, 私有属性拥有 ! twigil。

has $.x 就是私有属性 has $!x 加上一个getter方法, 即 method x() { ... }

has $.x is rw 就是私有属性 has $!x 加上一个getter/setter方法。

. twigil 就是调用了与属性同名的方法


class SaySomething {
    method a() { say "a";  }

    method b() { $.a;      }
    method c() { self.a(); } # 这证明了 $.a 的 . twigil 做了一次隐式的实例方法调用。
}

SaySomething.b; # 打印 "a"
SaySomething.c; # 打印 "a"

. twigil 中自动生成的方法可以被子类重写


use v6;

class Point {
    has $.x;
    has $.y;
}

class Circle is Point {
    has $!radius;

    # 重写父类中的 x() 方法和 y() 方法
    method x() {
        "I am x point in a Circle";
    }
    method y() {
        "I am y point in a Circle";
    }
}

my $circle = Circle.new(radius => 10);
$circle.x().say; # I am x point in a Circle
$circle.y.say;   # I am y point in a Circle

如果不想子类重写父类中的方法, 那么在父类中声明属性的时候, 使用 ! twigil 替代 . twigil

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容