2015-04-27 29 views
5

我在Rails應用程序中寫了一個jsonify視圖。我有:爲什麼在這個ruby方法調用中空間顯着?

json.samba_secrets_present(not @idp_ad_info.samba_secrets.nil?) 

產生一個語法錯誤:

app/views/idp_ad_infos/show.jsonify:7: syntax error, unexpected tIVAR, expecting '(' 

然而,

json.samba_secrets_present (not @idp_ad_info.samba_secrets.nil?) 

工作正常。我原本以爲第一個將是Jsonify::Builder對象上的方法調用samba_secrets_present方法,第一個參數爲not idp_ad_info.samba_secrets.nil?。爲什麼這個空間很重要?

+1

也許這是舊'not'運算符錯誤,例如'puts(not true)'失敗,但'puts((不是true))'工作正常。我忘記了這一點。 (或不是一個錯誤,如答案中所示,但解析的東西?) –

+1

完全不相關,但是''不是''超過'!'的用法是什麼?另一個SO回答說,'!'具有最高的優先級,'不'具有最低的優先級之一......但我仍然試圖找到一個使用'not'的理由。我寧願使用圓括號來強制所需的操作順序。 –

回答

5
puts(not true) #=> error 
puts (not true) #=> false, CASE 2 
puts(not(true)) #=> false 

Ruby允許您省略括號來調用方法有時。通常,如果只有一個方法調用,則可以省略括號。但是,當方法調用位於另一方法調用的參數位置時(一般情況,請參閱更新部分中的特殊情況),您不能省略該方法,因爲這會引入歧義。考慮下面的例子:

puts(not true, false) 
puts(some_method arg1, arg2) 

紅寶石解析器不能確定false(或arg2)是否是內方法,或外puts的參數,所以它會引發錯誤這些情況。解析器沒有運行環境來確定內部方法的參數,所以它不關心它是否是一元方法(如not)。

CASE 2作爲一個例子,這是解釋爲:

puts((not false)) 

,你可以寫:

puts (not false), true, (not true) 

他們所有參數puts

Some Ref: Positional Arguments

更新: toro2k評論說puts(system 'ls')作品。這是因爲system接受*args這將抓住所有其餘的參數。外部方法不會有任何參數,肯定是:)。因此,這種情況不存在歧義。

def a *args 
    args 
end 
p(a 1, 2, 3, 4) #=> [1, 2, 3, 4] 

但是,我會投票寫出更清晰的代碼和必要的括號,以使代碼更具可讀性。

+0

我得不到的是:爲什麼'puts(而不是'ls')'是一個語法錯誤,例如'puts(system'ls')'不是? – toro2k

+0

@ toro2k更新:) –

相關問題