2017-04-11 48 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中這樣做很好。 –

相關問題