Ответ 1
Я бы пошел за:
shipping_costs.values.map(&:to_i).max
nil.to_i
0
.
Дано:
shipping_costs = {
key1: 45,
key2: 99,
key3: nil,
key4: 24
}
Какой самый чистый способ получить максимальный размер этих ключей при условии, что nil = 0?
Если я запускаю прямую shipping_costs.values.max
в консоли Rails, я получаю следующее:
ArgumentError: comparison of Fixnum with nil failed
Самый чистый способ превратить эти нули в нули перед запуском max?
Я бы пошел за:
shipping_costs.values.map(&:to_i).max
nil.to_i
0
.
Если вы хотите сохранить его очень кратким, вы можете использовать
shipping_costs.values.compact.max
Метод compact
удаляет из массива все значения nil
.
Другие ответы также являются хорошими идеями. Однако я предпочел бы отказаться от значений вместо их замены числами. Я думаю, что лучше знать, что массив содержит только значения nil
, чем угадывать, откуда взялось 0 (или любое другое значение).
Никто не упомянул еще более короткую форму?
shipping_costs.values.max_by(&:to_i)
(Только информация)
max
берет блок, позволяя выполнить сравнение, аналогично тому, как работает sort
:
[45, 99, nil, 24].max{ |a,b| (a || 0) <=> (b || 0) }
=> 99
или
[45, 99, nil, 24].max{ |a,b| a.to_i <=> b.to_i }
=> 99
Это позволяет вам принуждать значение, как вы хотите/нуждаетесь, прежде чем произойдет сравнение.
В вашем случае shipping_costs.values
вернет массив, который вам нужно сравнить, поэтому:
shipping_costs.values.max{ |a,b| a.to_i <=> b.to_i }
Do shipping_costs.values.reject {|v| v.nil? }.max