我最近開始學習Ruby,我正在嘗試下面的一段代碼。幫我解密這個輸出
a=[1,2]
b='slam dunk'
a.each { |b| c=a*b; puts c;}
我收到以下輸出。我不知道爲什麼。我期望有一個錯誤或某些東西被拋出。有人能解釋我爲什麼發生這種情況嗎
1
2
1
2
1
2
感謝
我最近開始學習Ruby,我正在嘗試下面的一段代碼。幫我解密這個輸出
a=[1,2]
b='slam dunk'
a.each { |b| c=a*b; puts c;}
我收到以下輸出。我不知道爲什麼。我期望有一個錯誤或某些東西被拋出。有人能解釋我爲什麼發生這種情況嗎
1
2
1
2
1
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
塊變量b覆蓋「灌籃高手」,所以會發生什麼是
c=[1,2]*1 # => [1,2]
c=[1,2]*2 # => [1,2,1,2]
這是你在輸出
我覺得外b的內循環沒有影響。
在第一個循環中,您打印陣列一次。
在第二個循環中,您可以兩次打印陣列
當計算最初分配的每個變量b時,該值被該塊的b參數隱藏。
那麼每個循環實際上接收在每次通過是
[1,2] * 1 #1st Pass
[1,2] * 2 #2nd Pass
所以第一通打印1個2和第二通打印1 2 1 2(即它打印陣列兩次)
我不要做紅寶石,但我猜它是隱含的轉換邏輯......如果你將slamdunk和b更改爲[1,2]會發生什麼? – 2010-05-24 08:56:58
我試圖做這樣的改變,我得到一個錯誤**不能將字符串轉換爲整數(TypeError)** – bragboy 2010-05-24 09:00:10
您可能希望執行'puts c.inspect'而不是'puts c',以便您可以看看發生了什麼更好。 – 2010-05-25 00:06:17