![](/img/trans.png)
[英]Ruby: evaluation order depends on whitespace and seemingly redundant parens, why?
[英]How important is whitespace inside parens in Ruby?
我剛剛發現,parens中的空白可能會以一種意想不到的方式在Ruby中發揮作用:這里有3個函數在語義上與我相同:
def foo(x)
return {
:a => (x - 100),
}
end
def bar(x)
return {
:a => (x
- 100),
}
end
def zot(x)
return {
:a => (x -
100),
}
end
然而, foo(10)
和zot(10)
返回{:a=>-90}
(正如我所料),而bar(10)
返回{:a=>-100}
(讓我感到沮喪和失望)。
我在這里錯過了什么?
這是一個不尋常的案例,但我相信你所看到的是Ruby解釋那幾個連續的陳述而不是一個陳述。 正如它所看到的那樣:
x # Statement 1
-100 # Statement 2
該代碼塊的結果為-100
。
在的情況下, zot
您曾表示你的意圖繼續對下一該行通過具有懸掛-
二元運算符:
x - # Statement 1
100 # Statement 1 (cont)
值得注意的是,在進行方法調用時,您無法執行此操作:
zot(x
-100 # Syntax error
)
在這種情況下,參數語法規則要嚴格得多。 在自由形式(...)
結構內,你有更大的自由度。
在Ruby中,有兩種可能的表達式分隔符:分號;
和換行符。
所以,
a
b
是相同的
a; b
意思就是
a
- b
是相同的
a; - b
這是一樣的
a; b.-@()
當然,你期望它等同於
a - b
這是一樣的
a.-(b)
關鍵是:這兩種解釋中的每一種都同樣有效。 語言設計者必須選擇這兩種解釋中的一種,在這種情況下,他們選擇第一種解釋。 兩者都不是“正確”或更“正確”。
如果他們選擇了第二種解釋,那么你就不會問這個問題,但其他人會問對方的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.