Почему не «уменьшить» оценку блока для одноэлементных массивов? - PullRequest
0 голосов
/ 01 марта 2019

Я экспериментировал с методом ruby ​​reduce, который является отличным инструментом для манипулирования перечислимыми.

Мне было трудно понять, почему ниже возвращается строка, а не целое число, когда массив содержитодин элемент:

["1", "2"].reduce { |sum, i| sum.to_i + i.to_i }
#=> 3 <- expected

["1"].reduce { |sum, i| sum.to_i + i.to_i }
#=> "1" <- not expected, expecting it to be 1

, в то время как нижеприведенное работает как ожидалось:

["1"].reduce(0) { |sum, i| sum.to_i + i.to_i }
#=> 1

Я знаю, что я инициализирую аккумулятор со значением 0 в этом случае, но мне любопытно, почемупредыдущая реализация не работает!

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Последний работает, потому что вы даете уменьшить начальное значение аккумулятора, а затем он начинает итерацию.Если вы не дадите ему один, он берет первый элемент последовательности (в данном случае массив или что-нибудь перечислимое), а затем ему нечего перебирать, поэтому блок никогда не вызывается.

0 голосов
/ 01 марта 2019

Ну, я думаю, что нашел объяснение.Кажется, что Reduce не войдет в итерацию блока, определенную в методе Reduce, так как первый элемент уже был использован в качестве аккумулятора, поэтому массив оставлен пустым, и дальнейшая работа не требуется, поэтому элемент будет возвращаться как есть.

Что имеет смысл!в противном случае аккумулятор будет учтен дважды.

...