Ruby、bubble_sort_by(arr),代码正常但返回原始数组

Ruby, bubble_sort_by(arr), code is working but returning original array

小问题:
为什么我的方法(接受块)是 returning 原始数组而不是修改。

长问题:
代码如下:

def bubble_sort_by(array)
  array.each_with_index do |outer, outer_index|
    array.each_with_index do |inner, inner_index|
      if yield(outer, inner) > 0
        if outer_index < inner_index
              p "outer after if: " + outer        # for debugging, indented for clarity
              p "inner after if: " + inner        # for debugging
          outer, inner = inner, outer
              p "outer after swap: " + outer      # for debugging
              p "inner after swap: " + inner      # for debugging
        end
      end
    end
  end
end

bubble_sort_by(["hi","hello","hey"]) do |left,right|
  left.length - right.length
end

在 irb 中,我看到 outerinner 的值被交换(排序),但 return 值仍然是原始数组。

2.3.3 :1223 >     end
"outer after if: hello"
"inner after if: hey"
"outer after swap: hey"
"inner after swap: hello"
 => ["hi", "hello", "hey"] 
2.3.3 :1224 > 

我之前用非常相似的代码编写了类似的方法 bubble_sort(没有块),并且原始数组在那里被交换值替换。
我不明白为什么交换值没有保存在此处提到的方法中,而是收到原始数组。

你只是在交换局部变量

outer, inner = inner, outer

这不会修改 array,要更改您必须使用的数组 []=

array[n] = value

您需要更改数组项的值。这是工作代码:

def bubble_sort_by(array)
  array.each_with_index do |outer, outer_index|
    array.each_with_index do |inner, inner_index|
      if yield(outer, inner) > 0
        if outer_index < inner_index
              p "outer after if: " + outer        # for debugging, indented for clarity
              p "inner after if: " + inner        # for debugging
          outer, inner = inner, outer
              p "outer after swap: " + outer      # for debugging
              p "inner after swap: " + inner      # for debugging

          # change value array item
          array[inner_index] = inner
          array[outer_index] = outer
        end
      end
    end
  end
end