2017-01-16 27 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