Code Academy:Unit 5(Blocks& Sorting):Methodical Sorting

时间:2016-06-06 22:44:05

标签: ruby

如果我使用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

有人可以解释原因吗?

2 个答案:

答案 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)

@Aetherus答案很棒,但我认为这并不完全涵盖你的案例,你的第二个例子不起作用的原因与Ruby处理return语句的方式有关。如果未明确定义return语句,则method将返回最后一个语句,并在第二个示例中返回最后一个语句

    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

但你真的不应该这样做......