当我在ruby控制台中运行以下示例时,我感到很惊讶。它们都产生相同的输出。
"hello".length
和
"hello" .length
ruby控制台如何移除空间并提供正确的输出?
答案 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编写的文件,是用于定义解析器的语言。
即使不了解YACC的任何内容,您也应该能够通过查看文件来获得有关其工作原理的一些线索。