Perl 6 Shortcuts(第一部分)

查看原文

快捷(Shortcuts)是一个具有争议性的话题。有些人认为它让代码更快更易读。有些人认为它让代码变得更难度如果人们不熟悉那些快捷的话。这篇文章仅仅告诉你 Shortcuts 的东西, 用不用取决于你。让我们开始把。

类属性的公开 Getter/Setter


"getter" 和 "setter" 的概念在很多语言中是共通的: 在你的类中有一个 "东西", 并且你写了一个方法来设置或获取那个东西的值。以啰嗦的 Perl 6 方式来写, 这样的一个设置看起来像这样:

class Foo {
    has $!attr = 42;
    method attr is rw { $!attr }
}

my  $obj = Foo.new;
say $obj.attr;
    $obj.attr = 72;
say $obj.attr;

# 输出>>
# 42
# 72

这就像它本来的那样简洁, 但公共属性通常足以使编写这点儿代码变得恼人。这就是为什么 $. twigil 存在的原因。单独使用它会创建一个 "getter"; 如果你还想要一个 "setter", 需要使用 is rw 特性:

class Foo { has $.attr is rw = 42; }
my  $obj = Foo.new;
say $obj.attr;
    $obj.attr = 72;
say $obj.attr;

# 输出>>:
# 42
# 72

我们把属性上的 $! twigil 更改为 $. twigil, 并且它为我们创建了一个公共的方法。继续!

在方法调用中省略圆括号


下面这样的代码你不会经常看见, 代码末尾有一整吨的圆括号。确保它们都能匹配!

$foo.log( $obj.nukanate( $foo.grep(*.bar).map(*.ber) ) );

对于那些想起 popular webcomic 的人来说, Perl 6 还有一个备选项:

$foo.log: $obj.nukanate: $foo.grep(*.bar).map: *.ber;

如果方法在方法调用链的最后, 你可以省略它的圆括号并使用一个冒号 : 代替。除了 .grep, 我们上面所有的调用在链中都是最后的(last in chain), 所以我们避免了很多圆括号。有时我也喜欢在冒号后面换行开始写东西。

还要注意: 你总是可以省略方法调用中的圆括号, 如果你没有提供任何参数的话; 也不需要分号。

没有逗号的具名参数


如果你正调用一个提供只有具名参数的方法或子例程的话, 你可以省略参数之间的逗号。有时候, 我也喜欢把每个参数作为新行叠放在一块儿:

class Foo {
    method baz (:$foo, :$bar, :$ber) { say "[$foo, $bar, $ber]" }
}
    sub    baz (:$foo, :$bar, :$ber) { say "[$foo, $bar, $ber]" }

Foo.baz:
    :foo(42)
    :bar(72)
    :ber(100);

baz :foo(42) :bar(72) :ber(100);

# OUTPUT>>:
# [42, 72, 100]
# [42, 72, 100]

再次, 这在当你提供只有具名参数的时候才有效。有很多很多其它使用同样形式提供参数或 Pairs 但是你又不能省略逗号的地方。

具名参数/Pairs 中的整数


‘如果参数或 Pair 接收一个正整数作为值, 就把数字写在冒号和键的名字之间:

say DateTime.new: :2016year :2month :1day :16hour :32minute;

# 输出>>:
# 2016-02-01T16:32:00Z

这是其中之一当你第一次学习它的时候看起来不和谐的东西, 但是你会很快习惯它。它读起来很像英语:

my %ingredients = :4eggs, :2sticks-of-butter, :4cups-of-suger;
say %ingredients;

# OUTPUT>>:
# cups-of-sugar => 4, eggs => 4, sticks-of-butter => 2

具名参数/Pairs 中的布尔值


使用键自身的名字来标示 True, 在键名和冒号之间插入一个感叹号来标示 False:

sub foo (:$bar, :$ber) { say "$bar, $ber" }
foo :!bar :ber;

my %hash = :!bar, :ber;
say %hash;

# OUTPUT>>:
# False, True
# bar => False, ber => True

注意: 这也能应用在副词上!

具名参数/Pairs 中的 Lists


如果你正提供一个 quote-word 结构给一个期望某种 listy 的具名参数/pair, 那么你可以省略圆括号; 在键和 quote-words 之间不留任何空格就是了:

sub foo (:@args) { say @args }
foo :args<foo bar ber>;

my %hash = :ingredients<milk eggs butter>;
say %hash;

# OUTPUT>>:
# (foo bar ber)
# ingredients => (milk eggs butter)

传递变量给具名参数/Pairs


你认为具名参数就这样了吗?还有一个更酷的 shortcut: 假设你有一个变量并且它和具名参数拥有相同的名字… 就通过使用变量自身把它传递进来好了, 代替键, 在冒号之后:

sub hashify (:$bar, :@ber) {
    my %hash = :$bar, :@ber;
    say %hash;
}

my ( $bar, @ber )  = 42, (1..3);
hashify :$bar :@ber;

# OUTPUT>>:
# bar => 42, ber => [1..3]

注意我们既没有在 sub 调用中也没有在我们创建的 hash 中重复键的名字。它们是从变量的名字中派生出来的。

Subs 作为方法调用


如果你有一个 sub 想在某些东西上作为方法调用, 就在 sub 那儿前置一个 &符号就好。 调用者会是第一个位置参数, 所有其它参数像往常那样传递。

sub be-wise ($self, $who = 'Anonymous') { "Konw your $self, $who!" }

'ABC'.&be-wise.say;
'ABC'.&be-wise('Zoffix').say;

# OUTPUT>>:
# Know your ABC, Anonymous!
# Know your ABC, Zoffix!

这实质上是一种不那么难看的在某个实例上调用 .map的方式, 但是多数时候它的可读性更好。

sub be-wise ($self, $who = 'Anonymous') { "Know your $self, $who!" }

'ABC'.map({be-wise $_, 'Zoffix'})».say;
say be-wise 'ABC', 'Zoffix';

# OUTPUT>>:
# Know your ABC, Zoffix!
# Know your ABC, Zoffix!

为了完整性, 但不是过度使用, 你可以内联调用甚至使用一个 pointy block 来设置签名!

'ABC'.&('Know your ' ~ *).say;
'ABC'.&( -> $self, $who = 'Anonymous' {"Know your $self, $who!"} )('Zoffix')
    .say;

# OUTPUT>>:
# Know your ABC
# Know your ABC, Zoffix!

Hyper 方法调用


因为我们谈到了 .map 的快捷方式, 记住 » hyper 操作符。在方法调用的点号之前使用它以标示你想在调用者的每个元素身上调用点号后面跟着的方法, 而不是调用者本身。

(1, 2, 3)».is-prime.say;
(1, 2, 3)>>.is-prime.say;

# OUTPUT>>:
# (False True True)
# (False True True)

总结


  • 使用 $. twigil 来声明公共属性
  • 使用 :代替圆括号
  • 只含具名参数的 Methods/sub 调用不需要逗号
  • 通过把整数值写在键和冒号之间传递 Int 值
  • 使用键自身来指定一个 True 布尔值
  • 使用键自身, 并在键名和冒号之间插入一个 ! 号来指定一个 False
  • 当值是 quote-word 结构时, 把它写在键后面, 不含任何圆括号
  • 当变量和键的名字相同时, 把它直接用作键(包括符号), 不用指定任何值
  • 在 sub 那儿前置一个 &, 当把它作为方法调用时
  • 使用 » 操作符来对列表中的每个元素调用一个方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容