[英]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 <...>
之間的區別。 但是我的情況有什么區別? 為什么兩個括號不一樣?
添加額外括號“有效”的原因是因為嵌套括號為最里面的表達式提供了更高的優先級。 這消除了解析器的標記的歧義,並允許將該語句正確地評估為表達式而不是方法參數。
它與關鍵字的綁定優先級有關。 大括號的優先級高於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.