Пока циклы в 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)
Другие вопросы по тегам