2017-01-16 28 views
1

爲什麼下面的代碼無法產生預期的輸出,對於前兩個測試用例,如果我沒有將「then」部分添加到'If?'中我設置了第二個變量「False」的默認值,我的印象是,在Ruby中,一個方法可能帶有不確定數量的參數,並且在調用方法時缺少參數將回滾到使用默認值如果設置了方法內的那些參數。在Ruby中爲什麼If/Then邏輯寫入沒有If/Then結構失敗?

def alphabetize(arr,rev=false) 
    arr.sort! 
    if rev == true 
     arr.reverse! 
    end 
end 

numbers = [1,9,2,1,10] 

測試用例:

print alphabetize(numbers,false) 
=begin 
input: numbers,false 
output: nil 
expected output: 1,1,2,9,10 
=end 

print alphabetize(numbers) 
=begin 
input: numbers 
output: nil 
expected output 1,1,2,9,10 
=end 

print alphabetize(numbers,true) 
=begin 
input: numbers,true 
output: 10,9,2,1,1 
expected output: 10,9,2,1,1 
=end 

此代碼產生預期的結果:

def alphabetize(arr,rev=false) 
    if rev == true 
     arr.sort!.reverse! 
    else 
     arr.sort! 
    end 
end 

numbers = [1,9,2,1,10] 

回答

2

正在打印的alphabetize方法的返回值,這不一定數組的值。

在你的第一個代碼,你有一個if沒有相應else作爲最後一個發言。在Ruby中,當if條件失敗時,if語句無返回值的返回值爲nil

在您的第二個代碼中,您有一個ifelse陳述。因此,當if條件失敗時,方法的返回值將在else塊內執行。在這種情況下,arr.sort!

值得一提的alphabetize方法修改numbers陣列中被傳遞(在sort!reverse!方法由!表示)。如果您打印的是numbers,而不是返回值alphabhetize,則您也會獲得預期的輸出。

+0

如果是這種情況,最後的測試用例如何工作? – brooklynsweb

+0

@brooklynsweb我已經添加了進一步的說明。讓我知道它是否合理。 – phss

+0

這個解釋是有道理的,但後來我又寫了一個例子,它的行爲和我原本預期的一樣。有什麼不同? *不幸的是,評論字段沒有代碼格式選項;這裏有一個pastebin:http://pastebin.com/NGYYpqjB。更新:換句話說,第二個測試用例沒有返回'nil',它沒有返回任何內容,因爲如果'if'失敗,沒有定義動作。 – brooklynsweb

0

def alphabetize(arr,rev=false) 
 
    arr.sort! 
 
    if rev == true 
 
     arr.reverse! 
 
    end 
 
    arr 
 
end
返回數組中的時候,如果是假返回nil結束。確保它在方法結束時返回數組值。 經過rubyfiddle.com測試 http://rubyfiddle.com/riddles/c36bc/1