Пока циклы в Ruby и преобразование в функцию - PullRequest
2 голосов
/ 23 марта 2012

Я на Глава 33 из Learn Ruby the Hard Way.

Дополнительное кредитное упражнение 1 спрашивает:

Преобразовать этот цикл while в функциючто вы можете вызвать и заменить 6 в тесте (я <6) с переменной. </p>

Код:

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 ]

0 голосов
/ 23 марта 2012

Как говорит @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. Удачи в обучении.

0 голосов
/ 12 февраля 2016

Возможно, я неправильно прочитал «преобразовать цикл», но мое решение было:

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)
0 голосов
/ 23 марта 2012

Когда вы говорите def, i выходит за рамки. Метод не может «увидеть» это. Используйте @i вместо (@ дает переменную большую «видимость»), или переместите i=6 внутри метода, или выясните, как использовать параметры с методом.

...