理解`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"]
定义sort
或sort!
阻止你有义务接受两个参数,通常是a
和b
。 这些是排序操作当时比较的两个元素,因此将使用各种对重复调用此块。
对返回的内容施加约束,根据定义,您应该仅返回-1,0或+1。 其他值可能有效,但不是规范的一部分。 如果a
应该在系列中的b
之后,则返回-1
,如果它们是等价的则返回0
,如果b
应该在a
之后,则返回a
。
此外,对于任何给定的a
, b
和c
值集合,您应该返回一致的结果,如果a < b
且b < c
则a < c
。 如果你返回随机值,你的数组将是一个完整的混乱,并不一定完全排序。 排序算法中的优化取决于一致的结果。 如果你说c
之后,那么c
之后的所有值也必须在c
之后。
Ruby极有可能将所有正面值折叠成第二项出现在第一项之前的指示。 由于您为所有情况返回正值,因此您告诉排序算法所有值都在所有其他值之前,这是完全无意义的,因为这种情况永远不会发生。
所以,简而言之,你得到了垃圾,因为你给出了sort
函数垃圾和Garbage In,Garbage Out原则适用。
解决这个问题的方法是使用sort_by
方法,该方法只接受一个参数并为您处理这些比较:
letters.sort_by! { |x| letter.count(x) }