簡體   English   中英

Ruby:評估順序取決於空格和看似多余的括號,為什么?

[英]Ruby: evaluation order depends on whitespace and seemingly redundant parens, why?

我試圖了解 Ruby 中算術方法的行為。 1.+ 2.* 31.+ (2).* 31. + 2. * 31. + (2). * 3 1. + (2). * 31.+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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM