* vs $_ vs $

cale2 问了一个很难的问题

今天卡尔2拒绝问简单的问题。我们来看它今天问了什么难题:

<cale2> 我需要一份关于 * vs _ vs 的指南。

这个问题问得多么好。那三种东西都是语法糖, 因为上下文转换, 它们能很好地避免折行和更少的 bugs。

我们从我们的老朋友主题变量 $_ 开始。在 Perl 5 中它刚好出现在每个 sub 的外面。在 Perl 6 中它出现在块的默认值之外。

my &block =  { 'oi‽' };
&block.signature.say;
# OUTPUT«(;; $_? is raw)»

块的默认签名是一个名为 $_ 的位置参数。因此每个块都有一个主题变量 $_。还有其他设置 $_ 主题变量的语句,而不引入一个新的块,像 withgivengiven 的确引入了一个块,但它是特殊的,我在这里不说明细节)。

say $_ with 42;
# OUTPUT «42» 

因为它是默认的, Perl 6 会在很多地方期待它的出现。最突出的是当没有对象方法调用时。

$_ = 42; say 'oi‽' when 42;
.say;
# OUTPUT«oi‽ 42» 

一个单独的 $ 实际上是两个(有一点)的东西。在签名中,它是一个我们永远不能使用的位置参数标记(也许是因为我们不在乎),因为它没有名字,因此在它所应用的例程中不引入符号。它对于 protos 和免费的浮点签名很有用。它的第二个用途实际上引入了一个容器,也没有符号。它也是一个状态变量,它的初始化器(如果有一个)不被处理为状态,并将被调用多于一次。我们可以使用匿名状态变量来计数东西。

my @a = <a b c d>;
for @a { say @a[$++] };

# OUTPUT«a
b
c
d »  

我们可以滥用匿名变量 $ 在列表赋值中跳过我们不想要的值。当我们从一个子例程中得到一个短的列表时会很简洁。

my ($,$,$c) = <a b c d>;
say $c;
# OUTPUT«c» 

我很享受这样的事实,我懒得给一次性变量起名字。认知负荷越小越好。

Whatever * 是问题的难点。有时它是一个语法糖标记,我们用它来告诉 Perl 6 我们不关心什么将被选中。在其他时候,它意味着 Inf, 意思是它们中的所有。

my @a = <a b c d>;
put @a.pick(*);

# OUTPUT«c d b a» 

如果在参数列表中使用一个单独的 *,它将变成单例 Whatever。由于我们可以要求签名中的值,我们可以为 muitis 提供接口。

multi sub foo(Int $i){ $i * 42 };
multi sub foo(Whatever){ <42 oi‽ ♥>.pick };
say foo(*);
# OUTPUT«♥» (your results may vary) 

如果我们在包含运算符或调用的语句中使用 *,它会形成一个没有作用域的块,并像一个占位符变量一样运行,而不会丢失该块由 * 生成的信息。生成的 Callable 的类型是 Wh​​ateverCode 并且当提供了 Sub 或方法时, 例程可以在它上面采取不同的行动。与真正的占位符变量相反, Whatever 可以用在 where 子句中。

sub foo($a where * < 10){}

对于他的问题, 这不是一个完整的答案。这就是为什么我建议卡尔2去阅读文档。

感觉还没有完全说清楚这三个语法糖。

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

推荐阅读更多精彩内容

  • 第一章 概要 Comming soon! 第二章 基础 假设有一场乒乓球比赛,比赛结果以这种格式记录:Player...
    焉知非鱼阅读 302评论 0 0
  • 标题: Rakudo and NQP Internals子标题: The guts tormented imple...
    焉知非鱼阅读 1,277评论 1 3
  • 2016-10-20 号更新。 源文件可以在 github 或 perl6.org上找到. General Rak...
    焉知非鱼阅读 938评论 0 0
  • Perl 6 是 Perl 编程语言家族中的一员. 它仍旧在开发中, 几个解释器和编译器在同时进行. 它引入了很多...
    焉知非鱼阅读 713评论 0 2
  • 捕获 签名不仅仅是语法,它们是含有一列参数对象的 first-class 对象 。同样地,有一种含有参数集的数据...
    焉知非鱼阅读 500评论 0 0