我正在尝试返回一个数组,该数组对数组中的每个元素进行平方,但是我得到以下错误?
1) #square_array should square the elements in an array
Failure/Error: expect(square_array([9,10,16,25])).to eq([81,100,256,625])
NoMethodError:
undefined method `-' for nil:NilClass
# ./square_array.rb:3:in `block in square_array'
# ./square_array.rb:2:in `each'
# ./square_array.rb:2:in `square_array'
# ./spec/square_array_spec.rb:19:in `block (2 levels) in <top (required)>'
Finished in 0.03363 seconds (files took 0.30161 seconds to load)
但是只有当两位数字时才会出现问题,以下Ruby代码使用数组= [1,2,3]。为什么它不能使用两位数字?
def square_array(array)
array.each do |x|
array[x-1] = x ** 2
end
end
答案 0 :(得分:1)
出错的原因是这一行,
array[x-1] = x ** 2
each方法为self中的每个元素调用给定的块一次,将该元素作为参数传递。所以当你使用[1,2,3]时,x-1
返回0,1,2即可。但是当你使用[9,10,16,25]时,它返回8,9,15,24,这绝对不是数组索引。
您可以使用map
这样做,
def square_array(array)
array.map{|x| x ** 2}
end
要详细了解map
的工作原理,请查看here。
或者您可以使用each_with_index
,
def square_array(array)
array.each_with_index {|x, index| array[index] = x ** 2}
end
如果你真的只想使用each
(不推荐)
def square_array(array)
i = 0
array.each do |x|
array[i] = x ** 2
i+=1
end
end