簡體   English   中英

為什么多余的括號會在此代碼中有所作為?

[英]Why do extra parentheses make a difference in this code?

  • 1個括號:

     print ( (1..10).collect do |x| x**2 end ) SyntaxError: compile error 

    更多細節:

     (irb):1: syntax error, unexpected kDO_BLOCK, expecting ')' print ( (1..10).collect do |x| x**2 end ) ^ (irb):1: syntax error, unexpected kEND, expecting $end print ( (1..10).collect do |x| x**2 end ) ^ 
  • 2個括號:

     print (( (1..10).collect do |x| x**2 end )) 149162536496481100=> nil 

我了解print (a) do <...>print(a) do <...>之間的區別。 但是我的情況有什么區別? 為什么兩個括號不一樣?

TL; DR

添加額外括號“有效”的原因是因為嵌套括號為最里面的表達式提供了更高的優先級。 這消除了解析器的標記的歧義,並允許將該語句正確地評估為表達式而不是方法參數。

分析

它與關鍵字的綁定優先級有關。 大括號的優先級高於do / end關鍵字,因此可以使用:

print ( (1..10).collect { |x| x**2 } )

因為它將括號括起來的表達式解釋為表達式邊界,而不是作為方法參數的邊界。

您也可以這樣做:

print( (1..10).collect do |x| x**2 end )

因為這里的括號是一個參數,而不是一個表達式。

用這個:

print((1..10).collect do |x| x**2 end)

更好的是:

print((1..10).collect do |x|; x**2; end)

始終刪除方法名稱和括號之間的空格。 這是ruby解釋器的語法分析之一。 如果您同時輸入空格和括號,則有時紅寶石無法正確解釋。

當您將單獨的代碼行放在一行中時,請使用; 分開(因為應該將端塊放置在單獨的行中)

暫無
暫無

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

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