2013-03-11 105 views
0

我試圖瞭解在使用block編寫代碼時管道內部的局部變量創建(|)。並且在我的IRB以下代碼中也嘗試過。ruby​​中`| x,y |`和`| x; y = 0 |`有什麼區別?

[1,2,3].each {|x;y| y=x; print y} 

#123=> [1, 2, 3] 
[1,2,3].each {|x;y = 0| y=x; print y} 

#SyntaxError: (irb):1: syntax error, unexpected '=', expecting '|' 
#[1,2,3].each {|x;y = 0| y=x; print y} 
        ^
#(irb):1: syntax error, unexpected '}', expecting $end 
#  from C:/Ruby193/bin/irb:12:in `<main>' 

但不明白髮生了什麼事與第二代碼,而第一個是完美的。

誰能告訴我|x,y| and |x;y=0|之間的區別?希望這個 問題的答案對我有意義。

再下面我完美的作品:

a = "hello world".split(//).each{ |x,newstr = Array.new() | newstr = x.capitalize;puts newstr } 

#H 
#E 
#L 
#L 
#O 
# 
#W 
#O 
#R 
#L 
#D 
#=> ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"] 

回答

4

在Ruby 1.9開始不接受的值,它可以通過將;與塊參數分開來在塊中聲明局部變量。在你的例子中,x是一個塊參數,而y是一個局部變量。下面的代碼很好地說明了它。

> [1,2,3].each {|x; y| puts "x: #{x} - y: #{y}"} 
x: 1 - y: 
x: 2 - y: 
x: 3 - y: 
=> [1, 2, 3] 

由於y未初始化,因此沒有值。 從句法上講,不能像在第二個示例中那樣在管道| |之間直接初始化本地塊變量。這是被禁止的。

但是,在Ruby 1.9中,您可以設置塊參數的默認值。的確,

> [1,2,3].each {|x,y=0| puts "x: #{x} - y: #{y}"} 
x: 1 - y: 0 
x: 2 - y: 0 
x: 3 - y: 0 
=> [1, 2, 3] 

在語法上是正確的。這一次y是一個塊參數,默認值爲0。你可以用下面的圖解說明不同之處:

> { one: 1, two: 2, three: 3}.each {|x,y=0| puts "x: #{x} - y: #{y}"} 
x: one - y: 1 
x: two - y: 2 
x: three - y: 3 
=> {:one=>1, :two=>2, :three=>3} 
+0

請參閱我的更新。那麼爲什麼我們能夠在'|'中初始化數組對象呢? – 2013-03-11 10:43:05

+0

看到我的答案,你可以設置參數塊的默認值,而不是'||'之間的局部變量塊。這就是爲什麼你最後的例子是有效的。 – toch 2013-03-11 10:44:13

+0

好吧!這意味着'方法'也是阻止的,它允許默認值語法,但匿名塊不允許。 – 2013-03-11 10:47:46

1

;y被用來解決Ruby的作用域(陰影外部變量),因爲它裏面||

+0

我知道,但是我的問題是''y = 0'和''y'在'|'裏面有什麼區別。查看我的更新說明。 – 2013-03-11 10:38:49

+0

這只是Ruby禁止的。 – Ven 2013-03-11 10:39:54

相關問題