我想对my_array进行排序,然后颠倒顺序。
哪个标记正确?
my_array.sort.reverse!
或
my_array.sort!.reverse
或者它有什么不同?
由于
答案 0 :(得分:2)
你必须分解链:
首先,让我们了解sort
和sort!
方法之间的区别。
如果我写
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
对原稿进行排序并创建反转副本(原始版本没有反转)。