将数组传递到块中

Passing an array into a block

我在下面的街区有点迷路。

def sort_string(string)
  string.split(" ").sort{|a,b| a.length <=> b.length}.join(" ")
end

数组根据长度排序(从小到大)。我的困惑来自代码块中的变量 b 是什么。

如果我把字符串"example string here"拆分成一个数组然后排序,[example],[string],[here]是如何传到块{|a,b| a.length <=> b.length}中的?不明白数组的元素是怎么传到代码里然后比较的

当使用 sort 时,Ruby 将两个对象传递到块中。要比较它们,可以使用内置的 <=> 方法,也可以通过您设计的某种机制来确定一个是否小于 (-1)、等于 (0 ), 或大于 (1) 另一个。所以,a 是一个,b 是另一个。

对此进行冥想:

[1, 2, 3, 4].shuffle # => [4, 1, 3, 2]
  .sort { |i, j|
    [i, j] # => [4, 1], [4, 3], [1, 3], [4, 2], [3, 2], [1, 2]
    i <=> j # => 1,      1,      -1,     1,      1,      -1
  }
  # => [1, 2, 3, 4]

记住 <=> 的作用并比较每次循环返回的 i <=> j 比较的值。

但是您当然通过阅读 sort 的文档知道了这一点: