2012-03-22 8 views
2

私はのLearn Ruby the Hard Wayです。Rubyのループと関数への変換

エクストラクレジットエクササイズ1が求められます。

Convert this while loop to a function that you can call, and replace 6 in the test (i < 6) with a variable.

をコード:

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 

あなたが見ることができるように、私がしようとして限りですブロックを関数に変換し、変数を変数に変更しないでください。

エラー:

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>' 

は私が間違って何をしているのですか?

EDIT:さて、少し改善しました。あなたがdefを言うとき今の数字の変数がスコープ外にある...

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 

答えて

0

@steenslagによれば、iloopsの範囲外です。 iloopsでのみ使用されているため、@iを使用するように切り替えることはお勧めしません。

あなたの関数は、数値の配列を生成するために使用できるユーティリティです。関数は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

私はまた、変数と6を置き換える引数を持つ関数を思い付いた、私はOPを編集しましたコード。しかし、あなたが言ったように、現在の数字は見えません... – Stn

0

iはスコープの外に出ます。メソッドはそれを "見る"ことはできません。代わりに@iを使用してください(@は変数に大きな「可視性」を与えます)。またはメソッド内でi=6を移動するか、メソッドでパラメータを使用する方法を見つけます。

0

私は「変換whileループ」を読み違えているかもしれませんが、私の解決策だった:

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) 
関連する問題