оператор «список» является возвращаемым значением всего блока.Строка: «list [key] = []» имеет возвращаемое значение «list», поэтому для установки возвращаемого значения условия if в «list» не требуется другая строка, кроме возвращаемого значения list [key].push (ws) - это список [ключ].мы хотим получить обновленное значение списка в конце, поэтому нам нужно каждый раз возвращать это значение из блока, чтобы дальнейшая обработка действовала для обновленного списка, а не для чего-то другого.
В качестве фонакаждая строка ruby также имеет возвращаемое значение, поэтому, если это последняя строка блока или функции, она автоматически становится возвращаемым значением всего блока или функции соответственно.
Чтобы понять это далеепопробуйте такой код в irb:
a = [1,2,3,4,5]
b = a.inject(0) {|sum, val| puts sum; puts val; sum + val}
внутренний блок состоит из трех состояний;последний оператор возвращает значение sum + val в блок, который хранится в sum для использования в следующих итерациях.
Также попробуйте какой-нибудь код, подобный этому:
h = {:a => []}
b = h[:a].push 6
Посмотрите, что б оценивает;в вашем коде вам нужно, чтобы b был накопленным хешем, а не массив, который хранится в h [: a]