2017-08-10 90 views
0

我目前正在通過'學習Ruby硬盤方式'課程告訴自己Ruby,並且在函數中引用了數組變量的問題。訪問Ruby中的數組變量

關於while循環的部分,需要將while循環變成函數,將while循環參數調整爲變量。我的代碼:

#original while loop 
while i < 6 
    puts "At the top i is #{i}" 
    numbers.push(i) 
    i += 1 
    puts "Numbers now: ", numbers 
    puts "At the bottom i is #{i}" 
end 

#new function 
number_array = [] 
def number_cruncher(number, cap) 
    if number < cap 
    puts "At the top number is #{number}" 
    number_array.push(number) 
    number += 1 
    puts "Numbers now: ", number_array 
    puts "At the bottom number is #{number}" 
    number_cruncher(number, cap, number_array) 
    end 
end 

number_cruncher(0,6) 

運行這段代碼給出了一個NameError,因爲在函數引用number_array是未定義的局部變量。我可以理解這是錯誤的,但我無法弄清楚什麼變量範圍或語法可以讓我引用一個起始點爲空數組的變量 - 除非指定一個變量「number_array」作爲函數的參數,然後聲明number_array = [],這是功能性的,但似乎過於複雜。

我已經研究了Ruby中的變量作用域(這裏和其他地方),但仍然無法解決這個問題....我100%確定我真的很愚蠢,但幫助仍然不勝感激!

+0

可能重複的[爲什麼我不能訪問Ruby中的方法中的局部變量?](https://stackoverflow.com/questions/10779171/why-cant -i-access-a-local-variable-inside-a-method-in-ruby) – aristotll

回答

1

正常的方法也只是使這個具有默認值的參數:

def number_cruncher(number, cap, number_array = []) 

你也缺少了遞歸函數的關鍵return值。你需要這樣做:

def number_cruncher(number, cap, number_array = []) 
    return number_array if number >= cap # <-- !!!!! 

    puts "At the top number is #{number}" 
    number_array.push(number) 
    number += 1 
    puts "Numbers now: ", number_array 
    puts "At the bottom number is #{number}" 
    number_cruncher(number, cap, number_array) 
end 
+0

謝謝!再看一遍,我現在看到,如果我在所有情況下將number_array指定爲實例變量,它也可以工作(不知何故,以前無法使其工作)。爲什麼返回值至關重要?該功能似乎在沒有它的終端上運行。 –

+0

啊...它實際上是工作,因爲你*變異變量*! 'array.push'改變了原始變量的值,而不是僅僅返回一個新的值。例如,如果您嘗試使用'number_array + = [number]'這種方法,那麼您會明白爲什麼返回值至關重要,以使其作爲*功能*程序運行。 –

+0

我不確定你的意思是什麼?「如果我將number_array指定爲實例變量,它也可以工作」*,儘管...您的原始代碼永遠不會工作,因爲該方法只需要2個參數,但您用3. –