Проблема в том, что вы пытаетесь использовать глобальные переменные (которые называются так: @max, @min), но вы хотите, чтобы ваш код назначал значения, которые вы даже не назначаете.Вы бы предпочли выбирать локальные переменные вместо глобальных, если это возможно, из-за доступности.
Вторая проблема заключается в том, что в случае использования глобальной переменной вам не нужно ничего возвращать.например:
@value = 0
def test
@value = 1
end
puts @value ==> 0
test # change @value to 1
# it also return 1 because ruby return last statement value
puts @value ==> 1
В случае, если вы используете локальные переменные, вы должны вернуть несколько результатов.Вот где Ruby выполняет свою работу, Ruby автоматически приводит несколько операторов return к массиву и присваивает массиву несколько переменных)
list = [4,6,10,7,1,2]
def maxmin(list)
f = list.shift
if list.empty? then
return f, f # f is the minimum and the maximum of a list of one element
end
mi, ma = maxmin(list)
if (f > ma) then
ma = f
elsif (f < mi)
min = f
end
return mi, ma
end
min, max = maxmin(list)
printf("max=#{max}, min=#{min}")
Ваш способ работы довольно забавный (люблю рекурсивность), но он не очень элегантен, производительностьне очень хороши и, более того, это немного сбивает с толку, это далеко от понимания ruby.
list = [4,6,10,7,1,2]
def minmax(list)
max = list[0]
min = list[0]
list.each do |elem|
if elem > max then
max = elem
elsif elem < min
min = elem
end
end
return min, max
end
min, max = minmax(list)
printf("max=#{max}, min=#{min}")
Является более четкой версией вашего кода, даже если она менее крутая.Вы можете попробовать эти ответы с глобальными переменными, это должно быть легко.
Очевидно, из-за видения Ruby, когда вы закончите с этим, вы можете использовать Array.max и Array.min.