簡體   English   中英

為什么條件修飾符需要額外的括號?

[英]Why do I need extra parentheses for conditional modifier?

當我在方法的參數位置內使用條件修飾符時,我需要額外一對括號(如果不省略參數的括號):

def foo bar; end
foo(:baz if true) # => Error
foo(:baz if false) # => Error
foo (:baz if true) # => Error
foo (:baz if false) # => Error
foo((:baz if true)) # => No Error
foo((:baz if false)) # => No Error

為什么我需要這對額外的括號? 它消除歧義嗎?

這是Ruby中運算符優先級的問題。 考慮一個例子:

> [1 if true]
# SyntaxError: unexpected modifier_if, expecting ']'
# [1 if true]
     ^
> [(1 if true)]
# => [
#   [0] 1
# ]

Ruby在這里首先要評估方括號。 僅當產生結果時,她才會應用條件if。 在內部表達式中添加圓括號可解決問題,我們可能希望函數調用中的圓括號也足夠。

但是,等等……Ruby在函數調用中使用括號來表示參數列表。 恰好是空格。 嘗試查看后綴條件之前 ,將對參數列表進行評估。 因此, :baz if true ,則參數列表變為:baz if true ,而參數名稱中不允許使用空格(此階段尚無條件)。

添加第二對括號可將參數列表轉換為一個參數,包括在圓括號中。

在某些地方,不能使用帶有顯式形式的if_modifier的表達式-您必須使用括號對它進行評估。

就像您的函數調用示例一樣,您不能在哈希初始化中使用顯式的if_modifier,因此代碼:

  a = {'aa' => 1 if true}

會導致語法錯誤,因此還必須將其括在括號中:

  a = {'aa' => (1 if true)}

這是因為您期望參數不是條件,這就是為什么在編寫其他括號時不會出現錯誤,因為它返回nil或symbol

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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