2017-04-11 50 views

回答

6

您可以在任何地方放置空格,解释器查找行的末尾。例如:

有效

"hello". 
    length 

无效

"hello" 
    .length 

解释器看到的点在该行的末尾,知道有些事情要跟进。而在第二种情况下,它认为该行已完成。一行中空格的数量也是一样。解释者如何去除空间是否重要?重要的是你知道这个行为。

如果你愿意,你甚至可以

"hello" .  length 

,它仍然可以工作。

我知道这不是对你的问题的答案,而是“如何”的问题?

编辑:我在下面的评论中纠正。上面给出的多行示例在脚本而不是IRB中运行时都是有效的。我把他们和操作员混在一起。当以下运行脚本时也适用:

有效

result = true || false 

有效

result = true || 
    false 

无效

result = true 
    || false 
+1

恩,''你好“\ n.length'是完全有效的。 “irb”与Ruby本身并没有完全相同的解析规则。试试它自己的脚本而不是'irb',你会看到。 –

+0

你是对的。我把它和运营商混在一起。真实||假'是有效的,但是'true \ n ||假'无效。虽然'真实|| \ n false'也是有效的。我的错。 –

+0

如果答案的一半无效,该怎么做。删除它? –

4

这并没有太多做的控制台因为它与语言本身如何由编译器解析有关。

大多数语言都是以这样的方式解析的,首先将要分析的项目分组为TOKENS。然后,编译器被定义为期望某个特定的标记SEQUENCE来解释每个编程语句。

因为编译器只是在寻找一个TOKEN SEQUENCE,所以不管它们之间是否有空格都没关系。

在这种情况下,编译正在寻找:

STRING DOT METHOD_NAME 

所以,如果你写"hello".length,甚至"hello" . length都不会有问题。两者中都存在相同的令牌序列,这对编译器来说都很重要。

如果你很好奇这些令牌序列是如何在Ruby源代码中定义的,你可以看看parse.y周围行1042起:

https://github.com/ruby/ruby/blob/trunk/parse.y#L1042

这是使用YACC language书面文件,这是一种用于定义解析器的语言。即使不知道YACC的任何内容,您也应该已经能够通过稍微查看文件来获得关于它如何工作的一些线索。

+1

有时候,白色空间可能会引入模糊性,比如'example(arg)'和'example(arg)'可能根据上下文的不同来解释。通常最好避免放入不必要的空间。 – tadman

+0

是@tadman。好点子。这与编译器在编程语句的两种或更多种可能的解决方案之间无法消除歧义(花言巧语“无法读取程序员的思想”)有关。 – Casper

+1

这实际上确实与控制台有点关系。 'irb'解释空白不同于Ruby本身。将'y ='pancakes'\ n.length'倾倒到'irb'会导致问题,但在Ruby中这样做很好。 –

相关问题