2013-10-16 140 views
5

我想測試並行任務的返回值,我寫puts (x, y = 1, 2),但它不工作,並打印錯誤消息:紅寶石平行分配

SyntaxError: (irb):74: syntax error, unexpected ',', expecting ')' 
puts (x,y =1,2) 
    ^
(irb):74: syntax error, unexpected ')', expecting end-of-input 

這有什麼錯?

+0

嘗試不帶空格'puts(x,y = 1,2)' – tihom

+2

puts((a,b = 1,2)) –

+2

請站起來,請勿在參數括號前加空格 - matz。 .. [ref](http://www.justskins.com/forums/ruby-1-8-space-122361.html) – tihom

回答

11

你有兩個問題。

  1. puts(之間的空間防止被解釋爲參數列表中的組合列表。一旦在方法名稱後面放置空格,任何參數列表必須位於括號外,並且任何括號內的部分必須是合法表達式。在Ruby中,(x,y,z)不是一個合法的單一表達式,所以你會得到上述錯誤。

    如果刪除的空間,你會得到這樣的:

    > puts(x, y = 1, 2)  
    NameError: undefined local variable or method `x' for main:Object 
    

    那是因爲你的第二個問題:

  2. puts(x,y = 1,2)被解析爲puts(x, y=1, 2)聲明;也就是說,Ruby將它解釋爲傳遞三個參數到putsx是第一個,y=1是第二個,而2是第三個。由於x不在任務的左側,並且尚未定義,因此會出現上述錯誤。

    使用一個額外的括號以組整個指派一起作爲一個參數:

    > puts((x,y=1,2))  
    1  
    2  
    

但是請注意,這是通過包含兩個項目一個列表。它不會有所作爲與puts,但它會爲列表和各個參數之間區分方法:

> def foo(a,b) puts "a=#{a},b=#{b}" end 
> foo((x,y=1,2)) 
ArgumentError: wrong number of arguments (1 for 2) 

因此,在這種情況下,你需要標點符號的一個多件 - 的圖示操作:

> foo(*(x,y=1,2)) 
a=1, b=2 

有趣,但沒有什麼實際意義的,是事實,一旦你已經增加了一倍括號,就可以把後排空間,如果你想:

> puts ((x, y = 1, 2))  
1  
2  

但是,再次,它將它們從參數包裝轉化爲一個額外的表達式包裝;你可以放置任意數量的括號而不用改變任何東西。這意味着,在foo情況下,圖示操作員必須兩套括號外面去:

> foo (*(x,y=1,2)) 
SyntaxError: (irb):24: syntax error, unexpected tSTAR 
> foo *((x,y=1,2)) 
a=1, b=2 

它通常被認爲是不好的風格在Ruby中卻使用parenthesisless形式時,第一個參數本身包括括號。根據您的Ruby版本,您可能會收到有關此類語句的警告,但即使您沒有,也最好使用完全加括號的版本(在方法名稱後面沒有空格)。

5

這應該工作

puts((x, y = 1, 2)) 
+1

這將產生一個警告,因爲'puts'和'('之間的空格。 – toro2k

2
puts((x, y = 1, 2)) 
# >> 1 
# >> 2 

一組括號的方法調用,另一個用於裝飾分配作爲一個明確的表達。

1

puts是一種需要參數和打印的方法。在方法中,你可以將參數值設置爲任何默認值。在你的情況下,它不是平行分配,而是設置默認值。如果妳做

>puts(a, b = 1, 2) 
=> undefined local variable or method `a' for main:Object 
from (irb):1 

但如果u盤 'A' 的價值,說 '一= 99',做

>puts(a, b = 1, 2) 
99 
1 
2 
=> nil 

在Ruby中,如果u指定 '()' 明確,u言不由衷指定方法名開放(

def hi(x,y,z) 
    p x 
    p y 
    p z 
end 
=> nil 

2.0.0p247 :015 > hi(1,2,3) 
1 
2 
3 
=> 3 

2.0.0p247 :016 > hi (1,2,3) 
SyntaxError: (irb):16: syntax error, unexpected ',', expecting ')' 
hi (1,2,3) 
^
from /home/prasad/.rvm/gems/ruby-2.0.0-p247/gems/railties- 4.0.0/lib/rails/commands/console.rb:90:in `start' 
from /home/prasad/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start' 
from /home/prasad/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>' 
from bin/rails:4:in `require' 
from bin/rails:4:in `<main>' 

2.0.0p247 :017 > hi 1, 2, 3 
1 
2 
3 
=> 3 
1

puts是一種方法,而你正在嘗試的=(分配)的返回值傳遞給它之間的空間。要做到這一點,你必須把它包起來的兩對括號:

puts((x, y = 1, 2)) 

但是,這會導致代碼混淆,應該避免。

而是做的兩個步驟,它更容易和更清潔:

x, y = 1, 2 
puts x, y 

此外,你可以刪除puts線不破壞功能。