怎么排序!红宝石中的数组

时间:2014-10-23 15:22:25

标签: ruby

我想对my_array进行排序,然后颠倒顺序。

哪个标记正确?

my_array.sort.reverse!

my_array.sort!.reverse

或者它有什么不同?

由于

4 个答案:

答案 0 :(得分:2)

你必须分解链:

首先,让我们了解sortsort!方法之间的区别。 如果我写

array = [7,2,4]
array.sort!
array # => [2,4,7]

如果你写

array = [7,2,4]
foo = array.sort
array # => [7,2,4]
foo # => [2,4,7]

sort方法对数组进行排序,并将结果作为函数的输出返回,而sort!方法直接修改现有数组。

所以如果你写:

my_array.sort.reverse!

就像写作:

(my_array.sort). # => Here we create a new array who is calculated by sorting the existing one
reverse! # => Then we reverse this new array, who is not referenced by a variable.

如果你写:

(my_array.sort!). #=> Here you sort my_array and reinject the result into my_array !
reverse  # Then reverse it and inject the result into a NEW array

所以在这两种情况下,你都无法获得你想要的东西!你想做的是:

my_array.sort!.reverse!

或:

new_array = my_array.sort.reverse

答案 1 :(得分:1)

您将获得相同的输出,但是会修改初始数组。见:

2.1.1 :001 > my_array = ["a","d","b","c"]
 => ["a", "d", "b", "c"] 

用完全错误的命令声明一个带有a,b,c和d的数组。

2.1.1 :002 > my_array.sort.reverse!
 => ["d", "c", "b", "a"] 

在其上运行第一个命令会返回反向排序的数组

2.1.1 :003 > my_array
 => ["a", "d", "b", "c"] 

...但不修改原始数组本身。

2.1.1 :004 > my_array.sort!.reverse
 => ["d", "c", "b", "a"] 

运行第二个命令返回相同的结果,数组向后排序

2.1.1 :005 > my_array
 => ["a", "b", "c", "d"] 

但是数组本身已经被修改,但是sort!调用只能 。方法调用后!保存'对其调用的对象的更改并返回结果。所以在第二个:

  • 您对数组进行排序,保存更改并返回已排序的数组,然后
  • 在已排序的数组上运行reverse,该数组不会保存到任何内容,只会返回结果。

答案 2 :(得分:0)

my_array.sort!.reverse将修改接收方,以便在此次通话后对my_array进行排序,例如

my_array = [1,4,3,5,2]
my_array.sort!.reverse
#=> [5,4,3,2,1]
my_array 
#=> [1,2,3,4,5]

第二种形式my_array.sort.reverse!不会修改my_array,因为sort将首先dup数组,然后reverse!将修改未存储的此欺骗副本。如果没有my_array.sort.reverse

,这与!具有相同的影响
my_array = [1,4,3,5,2]
my_array.sort.reverse!
#=> [5,4,3,2,1]
my_array 
#=> [1,4,3,5,2]

第三,像my_array.sort!.reverse!之类的东西会修改接收器两次,这意味着my_array.sort!将对数组进行排序,然后.reverse!将反转数组。所以my_array现在将被排序和撤销。

my_array = [1,4,3,5,2]
my_array.sort!.reverse!
#=> [5,4,3,2,1]
my_array 
#=> [5,4,3,2,1]

虽然在这种情况下我认为你不需要bang !方法,因为第二种形式没有影响。红宝石中的!意味着"危险",可能会改变数据或产生其他意外结果。

答案 3 :(得分:0)

 my_array.sort!.reverse! 

正确的答案,因为您想要更改已有的数组。

 my_array.sort.reverse! 

创建一个已排序的副本并将其反转(原始副本不会更改)。

 my_array.sort!.reverse 

对原稿进行排序并创建反转副本(原始版本没有反转)。