2014-10-07 74 views
-1

當我嘗試在不減去數組大小的情況下運行第二行時,它不起作用。爲什麼不?爲什麼你需要從數組大小中減去?

values = [10, 9, 11, 2, 45] 
max_element = values.size - 1 
first = values[0] 
for i in 0..max_element 
    while first < values[i] 
    first = values[i] 
    end 
end 
p "The largest value is #{first}" 

除了對EnumerableArrayeach方法,是for是遍歷元素的集合唯一的迭代器?

+0

什麼是錯誤信息?這是一個數組越界問題嗎? – 2014-10-07 06:29:46

+1

如果您嘗試像'1..values.size'那樣從'1'進行迭代,那麼它就會缺乏知識;你不知道該索引是基於零的,這是一個合理的錯誤。但事實並非如此。你知道索引從'0'開始,仍然期望'0..value.size'工作。我不知道你如何去想這個工作。 – sawa 2014-10-07 06:32:07

+1

@sawa,稱之爲迷茫。 =) – user273072545345 2014-10-07 06:43:08

回答

2

因爲數組的索引是從零開始的,就像在C或Java:

values = [10, 9, 11, 2, 45] 
values.size #=> 5 

values[0] #=> 10 (1st element) 
values[4] #=> 45 (last element) 
values[5] #=> nil (this is beyond the last item) 

您可以使用...(三個點),以排除範圍的結束:

for i in 0...values.size 
    # ... 
end 

此外,您while應該是if

if first < values[i] 
    first = values[i] 
end 

# or 

first = values[i] if first < values[i] 
+0

嘿謝謝。如果你注意到我最後一句話,我試圖避免'each'和'max'等等,因此這個「程序」。 – user273072545345 2014-10-07 06:38:40

+0

@ user27307254534534534543沒有看到,我已經更新了我的問題。 – Stefan 2014-10-07 06:40:53

+0

我絕對感謝你的回答,特別是排除最後的三點小事。感謝您指出我的'while'應該是'if'。 – user273072545345 2014-10-07 06:54:08

2

A排列索引0開始其元素計數。 values.size爲您提供了數組內的元素數(以非空數組1開始)。請檢查下面的例子:

values = [10 , 9 ] 
index = 0  1 
size = 2 

values = [10 , 9 , 11 , 2 , 45 ] 
index = 0  1  2  3  4 
size = 5 

這就是爲什麼最後的元素總是在values.size - 1

+0

感謝您花時間解釋。 – user273072545345 2014-10-07 06:47:22

1

index因爲它會採取max_element = 5(值的大小),當我到5,您可以訪問值[5]在while循環中超出數值範圍

+0

感謝您花時間解釋循環中的超出範圍。 – user273072545345 2014-10-07 06:46:38