理解`sort!`块

现在我有一个arrays

letter = ['a','b','c','a','b','c','a','b','b'] 

有人可以解释以下返回值吗?

 letter.sort! { |x| letter.count(x) } #=> ["b", "b", "a", "c", "c", "a", "b", "b", "a"] 

定义sortsort! 阻止你有义务接受两个参数,通常是ab 。 这些是排序操作当时比较的两个元素,因此将使用各种对重复调用此块。

对返回的内容施加约束,根据定义,您应该仅返回-1,0或+1。 其他值可能有效,但不是规范的一部分。 如果a应该在系列中的b之后,则返回-1 ,如果它们是等价的则返回0 ,如果b应该在a之后,则返回a

此外,对于任何给定的abc值集合,您应该返回一致的结果,如果a < bb < ca < c 。 如果你返回随机值,你的数组将是一个完整的混乱,并不一定完全排序。 排序算法中的优化取决于一致的结果。 如果你说c之后,那么c之后的所有值也必须在c之后。

Ruby极有可能将所有正面值折叠成第二项出现在第一项之前的指示。 由于您为所有情况返回正值,因此您告诉排序算法所有值都在所有其他值之前,这是完全无意义的,因为这种情况永远不会发生。

所以,简而言之,你得到了垃圾,因为你给出了sort函数垃圾和Garbage In,Garbage Out原则适用。

解决这个问题的方法是使用sort_by方法,该方法只接受一个参数并为您处理这些比较:

 letters.sort_by! { |x| letter.count(x) }