2010-05-24 42 views
0

我最近開始學習Ruby,我正在嘗試下面的一段代碼。幫我解密這個輸出

a=[1,2] 
b='slam dunk' 
a.each { |b| c=a*b; puts c;} 

我收到以下輸出。我不知道爲什麼。我期望有一個錯誤或某些東西被拋出。有人能解釋我爲什麼發生這種情況嗎

1 
2 
1 
2 
1 
2 

感謝

+0

我不要做紅寶石,但我猜它是隱含的轉換邏輯......如果你將slamdunk和b更改爲[1,2]會發生什麼? – 2010-05-24 08:56:58

+0

我試圖做這樣的改變,我得到一個錯誤**不能將字符串轉換爲整數(TypeError)** – bragboy 2010-05-24 09:00:10

+1

您可能希望執行'puts c.inspect'而不是'puts c',以便您可以看看發生了什麼更好。 – 2010-05-25 00:06:17

回答

2

首先,我會嘗試看看解釋你看到的輸出。

在ruby中,如果我們有一個數組,例如[1, 2]並將其乘以n然後您得到重複的陣列n次,例如,

irb(main):012:0> [1,2] * 2 
=> [1, 2, 1, 2] 

所以你each環打印[1, 2] * 1其次[1, 2] * 2

如果你問爲什麼有分配給一個字符串b,然後分配給數不產生錯誤,那麼這是不是一個問題動態類型的語言,如紅寶石。例如

irb(main):017:0> a = 5 
=> 5 
irb(main):018:0> a = 'no problem' 
=> "no problem" 

你的每一個循環b後,將只有最後一個值它在循環,即2

4

塊變量b覆蓋「灌籃高手」,所以會發生什麼是

c=[1,2]*1 # => [1,2] 
c=[1,2]*2 # => [1,2,1,2] 

這是你在輸出

0

我覺得外b的內循環沒有影響。
在第一個循環中,您打印陣列一次。
在第二個循環中,您可以兩次打印陣列

1

當計算最初分配的每個變量b時,該值被該塊的b參數隱藏。

那麼每個循環實際上接收在每次通過是

[1,2] * 1 #1st Pass 
[1,2] * 2 #2nd Pass 

所以第一通打印1個2和第二通打印1 2 1 2(即它打印陣列兩次)