Пока циклы в Ruby и преобразование в функцию
Я в 33-й главе "Изучай Руби трудный путь".
Дополнительное кредитное упражнение 1 спрашивает:
Преобразуйте этот цикл while в функцию, которую вы можете вызвать, и замените 6 в тесте (i < 6) переменной.
Код:
i = 0
numbers = []
while i < 6
puts "At the top i is #{i}"
numbers.push(i)
i = i + 1
puts "Numbers now: #{numbers}"
puts "At the bottom i is #{i}"
end
puts "The numbers: "
for num in numbers
puts num
end
Моя попытка:
i = 0
numbers = []
def loops
while i < 6
puts "At the top i is #{i}"
numbers.push(i)
i = i + 1
puts "Numbers now: #{numbers}"
puts "At the bottom i is #{i}"
end
end
loops
puts "The numbers: "
for num in numbers
puts num
end
Как вы можете видеть, я дошел до того, что пытался превратить блок в функцию, пока не сделал 6 переменной.
Ошибка:
ex33.rb:5:in `loops': undefined local variable or method `i' for main:Object (Na
meError)
from ex33.rb:15:in `<main>'
from ex33.rb:15:in `<main>'
Что я делаю неправильно?
РЕДАКТИРОВАТЬ: Хорошо, немного улучшили. Теперь переменная чисел выходит за рамки...
def loops (i, second_number)
numbers = []
while i < second_number
puts "At the top i is #{i}"
i = i + 1
numbers.push(i)
puts "Numbers now: #{numbers}"
puts "At the bottom i is #{i}"
end
end
loops(0,6)
puts "The numbers: "
for num in numbers
puts num
end
3 ответа
Как говорит @steenslag, i
выходит за рамки loops
, Я бы не рекомендовал переходить на использование @i
так как i
используется только loops
,
Ваша функция - это утилита, которую можно использовать для создания массива чисел. Функция использует i
чтобы выяснить, как далеко это сделано (но вызывающая функция не заботится об этом, она только хочет получить результат numbers
). Функция также должна возвращать numbers
, так что переместите это внутрь loops
тоже.
def loops
i = 0
numbers = []
while i < 6
puts "At the top i is #{i}"
numbers.push(i)
i = i + 1
puts "Numbers now: #{numbers}"
puts "At the bottom i is #{i}"
end
end
Теперь вы должны думать о том, что вызывающий loops
больше не могу видеть numbers
, Удачи в изучении.
Когда ты сказал def
, i
выходит за рамки. Метод не может "увидеть" это. использование @i
вместо (@ дает переменную большую "видимость"), или переместите i=6
внутри метода или выяснить, как использовать параметры с методом.
Возможно, я неправильно прочитал "преобразовать цикл", но мое решение было:
def loop(x, y)
i = 0
numbers = []
while i < y
puts "At the top i is #{i}"
numbers.push(i)
i += 1
puts "Numbers now: ", numbers
puts "At the bottom i is #{i}"
end
puts "The numbers: "
# remember you can write this 2 other ways?
numbers.each {|num| puts num }
end
loop(1, 6)