当我在ruby控制台中运行以下示例时,我感到很惊讶。它们都产生相同的输出。“hello”.length和“hello”.length是什么区别?
"hello".length
和
"hello" .length
如何红宝石控制台中删除的空间,并提供正确的输出?
当我在ruby控制台中运行以下示例时,我感到很惊讶。它们都产生相同的输出。“hello”.length和“hello”.length是什么区别?
"hello".length
和
"hello" .length
如何红宝石控制台中删除的空间,并提供正确的输出?
您可以在任何地方放置空格,解释器查找行的末尾。例如:
有效
"hello".
length
无效
"hello"
.length
解释器看到的点在该行的末尾,知道有些事情要跟进。而在第二种情况下,它认为该行已完成。一行中空格的数量也是一样。解释者如何去除空间是否重要?重要的是你知道这个行为。
如果你愿意,你甚至可以
"hello" . length
,它仍然可以工作。
我知道这不是对你的问题的答案,而是“如何”的问题?
编辑:我在下面的评论中纠正。上面给出的多行示例在脚本而不是IRB中运行时都是有效的。我把他们和操作员混在一起。当以下运行脚本时也适用:
有效
result = true || false
有效
result = true ||
false
无效
result = true
|| false
这并没有太多做的控制台因为它与语言本身如何由编译器解析有关。
大多数语言都是以这样的方式解析的,首先将要分析的项目分组为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的任何内容,您也应该已经能够通过稍微查看文件来获得关于它如何工作的一些线索。
恩,''你好“\ n.length'是完全有效的。 “irb”与Ruby本身并没有完全相同的解析规则。试试它自己的脚本而不是'irb',你会看到。 –
你是对的。我把它和运营商混在一起。真实||假'是有效的,但是'true \ n ||假'无效。虽然'真实|| \ n false'也是有效的。我的错。 –
如果答案的一半无效,该怎么做。删除它? –