如果我使用alphabetize(a,true)或alphabetize(a),这是有效的:
def alphabetize(arr, rev=false)
if rev == true
arr.sort.reverse!
else
arr.sort!
end
end
但是当我输入arr作为我唯一的参数时,这不适用于默认情况,alphabetize(a)或alphabetize(a,true),但仅适用于alphabetize(a,true):
def alphabetize(arr, rev=false)
arr.sort!
if rev == true
arr.sort.reverse!
end
end
有人可以解释原因吗?
答案 0 :(得分:2)
方法Array#sort!
(注意爆炸)执行就地排序,这意味着原始数组会被排序。
array = [1, 3, 4, 5, 2]
array.sort! #=> [1, 2, 3, 4, 5]
array #=> [1, 2, 3, 4, 5]
方法Array#sort
(没有爆炸)不会更改原始数组,而是返回一个已排序的新数组。
array = [1, 3, 4, 5, 2]
array.sort #=> [1, 2, 3, 4, 5]
array #=> [1, 3, 4, 5, 2]
所以你的问题出现在第4行,它总是反转一个新的数组而不是原来的数组。
P.S。在写下代码之前,请仔细考虑您希望代码执行的操作。你的代码应该修改原始数组吗?
如果你的答案是肯定的,那么你的代码应该是
# By convention, in-place modification method names end with a !
def alphabetize!(arr, rev=false)
arr.sort!
# Don't use rev == true. It's redundant.
arr.reverse! if rev
arr
end
如果答案是否定的,那么
def alphabetize(arr, rev=false)
new_array = arr.sort
# Think why I'm using in-place reverse here.
new_array.reverse! if rev
new_array
end
答案 1 :(得分:0)
if rev == true
arr.sort.reverse!
end
当rev为false时,返回nil,因此您的方法不会返回您期望的值。
更新
如果您希望第二个示例有效,您应该这样做:
def alphabetize(arr, rev=false)
return arr.sort! if !rev
if rev == true
arr.sort.reverse!
end
end
但你真的不应该这样做......