我想測試並行任務的返回值,我寫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
這有什麼錯?
我想測試並行任務的返回值,我寫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
這有什麼錯?
你有兩個問題。
puts
和(
之間的空間防止被解釋爲參數列表中的組合列表。一旦在方法名稱後面放置空格,任何參數列表必須位於括號外,並且任何括號內的部分必須是合法表達式。在Ruby中,(x,y,z)
不是一個合法的單一表達式,所以你會得到上述錯誤。
如果刪除的空間,你會得到這樣的:
> puts(x, y = 1, 2)
NameError: undefined local variable or method `x' for main:Object
那是因爲你的第二個問題:
puts(x,y = 1,2)
被解析爲puts(x, y=1, 2)
聲明;也就是說,Ruby將它解釋爲傳遞三個參數到puts
:x
是第一個,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版本,您可能會收到有關此類語句的警告,但即使您沒有,也最好使用完全加括號的版本(在方法名稱後面沒有空格)。
puts((x, y = 1, 2))
# >> 1
# >> 2
一組括號的方法調用,另一個用於裝飾分配作爲一個明確的表達。
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
puts
是一種方法,而你正在嘗試的=
(分配)的返回值傳遞給它之間的空間。要做到這一點,你必須把它包起來的兩對括號:
puts((x, y = 1, 2))
但是,這會導致代碼混淆,應該避免。
而是做的兩個步驟,它更容易和更清潔:
x, y = 1, 2
puts x, y
此外,你可以刪除puts
線不破壞功能。
嘗試不帶空格'puts(x,y = 1,2)' – tihom
puts((a,b = 1,2)) –
請站起來,請勿在參數括號前加空格 - matz。 .. [ref](http://www.justskins.com/forums/ruby-1-8-space-122361.html) – tihom