首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个Perl 6提要操作符是“假语句”?

为什么这个Perl 6提要操作符是“假语句”?
EN

Stack Overflow用户
提问于 2017-07-23 20:12:23
回答 1查看 248关注 0票数 8

我以第10天- Perl 6 2010 Advent日历的喂养操作符为例,对不再存在的.ucfirst.uc做了细微的更改:

代码语言:javascript
复制
my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
    ==> grep { /at/ } ==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;

我用一些额外的空格编写它时略有不同:

代码语言:javascript
复制
my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
    ==> grep { /at/ }
    ==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;

现在这是一种“虚假声明”:

===SORRY!===编译时出错.伪语句

这并不是这个例子的问题。当前文档中的一些示例可以显示相同的行为。

如果我在违规行的末尾添加了一个不空间,它将再次工作:

代码语言:javascript
复制
my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
    ==> grep { /at/ } \
    ==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;

奇怪的是,该行末尾的评论不起作用。我本以为它会吃掉这个令人讨厌的空格。

进给操作符说:

对于使用单个参数或第一个参数为块的例程/方法,通常需要使用括号进行调用

这样做是可行的:

代码语言:javascript
复制
my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
    ==> grep( { /at/ } )
    ==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;

但为什么这不是第一种形式的问题呢?空格在这里做什么?在“经常需要”中包括了哪些情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-23 20:45:48

来自Perl 6关于分离语句的文档。

结尾的大括号后面跟着换行符意味着语句分隔符

换句话说,每当结束大括号的块是行中的最后一件事(不包括空格和注释)时,解析器就会在其后面隐式插入分号。

这允许我们在}之后不使用分号编写类似于下面的内容

代码语言:javascript
复制
my @foo = @bar.map: {
    ...
}

分号在那里会很难看,如果您首先将循环写为for @bar { ... },然后决定将其转换为带有这样的赋值的map,那么添加尾随分号将很烦人,很容易忘记。因此,在大多数情况下,在行尾块之后自动终止语句是有帮助的.

然而,饲料运营者进入区块是一个例子(可能是唯一的),它把人绊倒。

要防止这种情况发生,请插入\ (a.k.a )。( 不空间)块之后,正如您已经注意到的。unspace使包含新行的空格对解析器不可见,因此将不应用上述基于换行符的解析器规则。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45269484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档