bri*_*foy 7 whitespace perl6 feed-operator
我把这个例子从10日- Perl 6的2010出现日历的饲料经营者与细微变化.uc的.ucfirst是不再有:
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;
Run Code Online (Sandbox Code Playgroud)
我用一些额外的空格稍微改写一下:
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;
Run Code Online (Sandbox Code Playgroud)
现在这是一个"虚假陈述":
Run Code Online (Sandbox Code Playgroud)===SORRY!=== Error while compiling ... Bogus statement ------> ==> grep { /at/ }?<EOL> expecting any of: postfix prefix statement end term
这个例子不是问题.当前文档中的一些示例可以表现出相同的行为.
如果我在违规行的末尾添加一个空格,它会再次起作用:
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;
Run Code Online (Sandbox Code Playgroud)
奇怪的是,该行末尾的评论不起作用.我本以为它会吃掉那些令人讨厌的空白.
该饲料经营者说:
对于采用单个参数或第一个参数是块的例程/方法,通常需要使用括号调用
这样可行:
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;
Run Code Online (Sandbox Code Playgroud)
但为什么不是第一种形式的问题呢?在这里做什么空白?什么情况包含在"经常需要"中?
从关于分离语句的Perl 6文档:
后面的大括号后面跟一个换行符表示一个语句分隔符
换句话说,每当一个块的右括号是行中的最后一个(不计算空格和注释)时,解析器就会隐式地在它后面插入一个分号.
这允许我们在没有分号后写下面的内容}:
my @foo = @bar.map: {
...
}
Run Code Online (Sandbox Code Playgroud)
分号在那里会很难看,如果你先写了循环for @bar { ... },然后决定将它变成一个map像这样的赋值,那么添加尾随分号会很烦人而且容易忘记.因此,在大多数情况下,在行尾块之后的这种自动语句终止是有帮助的.
但是,饲料操作员进入区块是一种情况(可能是唯一的一种),它会让人们绊倒.
为防止它发生,请在块之后插入\(也称为空格),如您已经注意到的那样.unspace使包含换行符的空白对解析器不可见,因此不会应用上述基于换行的解析器规则.