[英]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.