2016-02-11 3 views
1

Я немного потерялся на блоке ниже.Передача массива в блок

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}? Я не понимаю, как элементы массива передаются в код, а затем сравниваются.

+0

Где вы думаете, '[[пример], [строка], [здесь] ] 'происходит? Такие вещи никогда не проходят. – sawa

ответ

3

При использовании 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:

+0

Перечислимый документ помог. Я ушел из массива doc и немного потерялся. – Jbur43

+0

Я хочу потратить время на размышления об этом. Это обычная фраза в мире Perlmonks. –

+1

Это должно было быть «Медитировать». Автоматическая проверка орфографии вскочила. –

Смежные вопросы