[英]Ruby: evaluation order depends on whitespace and seemingly redundant parens, why?
我試圖了解 Ruby 中算術方法的行為。 1.+ 2.* 3
和1.+ (2).* 3
和1. + 2. * 3
和1. + (2). * 3
1. + (2). * 3
和1.+2.*3
都計算為 7,這意味着:+
在:*
之前調用,但1.+(2).*3
計算為 9,這意味着:*
在:+
之前調用。 重新定義這兩種方法證實了這就是正在發生的事情:
class Integer
alias_method :add, :+
alias_method :mul, :*
def + other
print :+
self.add other
end
def * other
print :*
self.mul other
end
end
puts 1 .+ 2 .* 3
puts 1 .+ (2) .* 3
puts 1. + 2. * 3
puts 1. + (2). * 3
puts 1.+2.*3
puts 1.+(2).*3
Output:
*+7
*+7
*+7
*+7
*+7
+*9
為什么會這樣? 請指出在哪里可以找到相關文檔。 提前致謝。
讓我們舉一個可能更容易理解的例子
puts (2) + 3
對比
puts(2) + 3
在第一種情況下,puts 后跟一個空格。 Ruby 將其視為省略的括號,並將 rest 作為參數進行評估。 它相當於puts((2) + 3)
。 5印出來了。 在第二種情況下,puts 后面緊跟一個左括號,ruby 將其作為方法 arguments 的開頭。 它相當於(puts(2)) + 3
。 它將打印 2 ,然后在嘗試評估nil + 3
時失敗。
現在讓我們看看你的例子
puts 1 .+ 2 .* 3
puts 1 .+ (2) .* 3
puts 1. + 2. * 3
puts 1. + (2). * 3
puts 1.+2.*3
在前 6 種情況下,沒有方法調用緊跟(
,所有括號都是多余的。它們是從右到左計算的。請注意,不是*
在+
之前,而是從右到左。
puts 1 .* 2 .+ 3 #=> 5
在最后一個示例puts 1.+(2).*3
, (
緊跟在.+
之后,因此2
是.+
的參數。然后將結果乘以 3。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.