将数组传递到块中
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
的文档知道了这一点:
我在下面的街区有点迷路。
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
的文档知道了这一点: