“hello”。length和“hello”.length有什么区别?

时间:2017-04-11 17:37:05

标签: ruby

当我在ruby控制台中运行以下示例时,我感到很惊讶。它们都产生相同的输出。

"hello".length

"hello"                     .length

ruby​​控制台如何移除空间并提供正确的输出?

2 个答案:

答案 0 :(得分:6)

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

有效

"hello".
  length

无效

"hello"
  .length

解释器看到行尾的点,知道必须跟进它。而在第二种情况下,它认为线已完成。一行中的空间量也是如此。解释器如何移除空格是否重要?重要的是你知道这种行为。

如果你想要,你甚至可以

"hello"   .      length

它仍然可以使用。

我知道这不是你问题的答案,但“怎么样”很重要?

编辑:我在下面的评论中得到了纠正。上面给出的多行示例在脚本而不是IRB中运行时都是有效的。我把他们和经营者搞混了。运行脚本时,以下内容也适用:

有效

result = true || false

有效

result = true ||
  false

无效

result = true
  || false

答案 1 :(得分:4)

这与控制台没有多大关系,因为它与编译器如何解析语言本身有关。

解析大多数语言的方式是首先将要解析的项目分组到TOKENS中。然后定义编译器以期望令牌的某个SEQUENCE以便解释每个编程语句。

因为编译器只是寻找一个TOKEN SEQUENCE,所以如果它们之间有空间并不重要。

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

"hello"  .  length

所以如果你写parse.y,甚至是476px都没关系。两个令牌中都存在相同的令牌序列,这对编译器来说非常重要。

如果您对如何在Ruby源代码中定义这些令牌序列感到好奇,可以从第1042行开始查看@media (max-width: 476px) { ... }

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

这是使用YACC language编写的文件,enter image description here是用于定义解析器的语言。

即使不了解YACC的任何内容,您也应该能够通过查看文件来获得有关其工作原理的一些线索。