當我在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'也是有效的。我的錯。 –
如果答案的一半無效,該怎麼做。刪除它? –