当我尝试在不减去数组大小的情况下运行第二行时,它将无法工作。为什么不?
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}"
除Enumerable
或Array
上的方法(例如each
)之外,for
是唯一循环遍历元素集合的迭代器吗?
答案 0 :(得分:3)
因为数组索引从零开始,就像在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]
答案 1 :(得分:2)
数组在索引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
这就是为什么最后一个元素始终位于index
的{{1}}
答案 2 :(得分:1)
因为它需要max_element = 5(值的大小),当我得到5时,你访问while循环中的值[5],这超出了数组值范围