each_with_object
не работает с неизменяемыми объектами, такими как integer.
(1..3).each_with_object(0) {|i,sum| sum += i} #=> 0
Это потому, что each_with_object
перебирает коллекции, передавая каждый элемент и данный объект к блоку. Он не обновляет значение объекта после каждой итерации и возвращает исходный заданный объект.
Он будет работать с хэшем, так как изменение значения хэш-ключа изменяет его для оригинального объекта.
(1..3).each_with_object({:sum => 0}) {|i,hsh| hsh[:sum] += i}
#=> {:sum => 6}
String
Объекты интересны. Они изменчивы, так что вы могли бы ожидать следующее вернуться «ABC»
("a".."c").each_with_object("") {|i,str| str += i} # => ""
, но это не так. Это связано с тем, что str += "a"
возвращает новый объект, и исходный объект остается прежним. Однако, если мы делаем
("a".."c").each_with_object("") {|i,str| str << i} # => "abc"
это работает, потому что str << "a"
изменяет исходный объект.
Для получения дополнительной информации см рубина документов для each_with_object
Для ваших целей, используйте inject
(1..3).inject(0) {|sum,i| sum += i} #=> 6
# or
(1..3).inject(:+) #=> 6
Кстати. Может кто-то сказать мне, почему Ruby не бросает какую-то ошибку при выполнении 'sum + = i', т.е. пытаясь изменить неизменяемый объект? Весь смысл здесь в том, что бедный пользователь остался один, не имея понятия, что его команда просто бесшумно ... –