我在想each_with_object应该怎么用.

我举了一个不起作用的例子:

> (1..3).each_with_object(0) {|i,sum| sum+=i}
=> 0

我假设结果是6!我的错在哪里?

推荐答案

each_with_object不适用于integer等不可变对象.

(1..3).each_with_object(0) {|i,sum| sum += i} #=> 0

这是因为each_with_object迭代一个集合,将每个元素和给定对象传递给块.它不会在每次迭代后更新object的值,并返回原始的给定对象.

它将与哈希一起工作,因为更改哈希键的值会自动更改原始对象的哈希值.

(1..3).each_with_object({:sum => 0}) {|i,hsh| hsh[:sum] += i}
#=> {:sum => 6}

String件物品是一个有趣的例子.它们是可变的,因此您可能会想到以下几点

("a".."c").each_with_object("") {|i,str| str += i} # => ""

但事实并非如此.这是因为str += "a"返回一个新对象,而原始对象保持不变.然而,如果我们

("a".."c").each_with_object("") {|i,str| str << i} # => "abc"

它之所以有效,是因为str << "a"修改了原始对象.

有关更多信息,请参阅ruby docs For each_with_object

为了你的目的,使用inject

(1..3).inject(0) {|sum,i| sum += i} #=> 6
# or
(1..3).inject(:+) #=> 6

Ruby相关问答推荐

Ruby错误-应为数组或字符串,已获取哈希

Ruby迭代器与函数.返回函数的第一个值,而不交互整个列表

如何使用Ruby range?

如何将包含换行符(和可能其他特殊字符)的Ruby字符串转义为有效的shell变量值?

如何解密在 sjcl.js 中使用 ruby​​ 创建的 AES-256-GCM

环绕分隔线,保留第一列,最小最终长度

Ruby:如何计算相对于另一个路径的路径?

Ruby 中的关联数组

Rails - RSpec - let和let!之间的区别

我不明白Ruby本地范围(local scope)

与 String 相比,在 Ruby 中使用 StringIO 有哪些优势?

Ruby 与计算机科学相关的 yield 特性

Ruby数组限制方法

Ruby 1.9:如何正确大写和小写多字节字符串?

Ruby全局匹配正则表达式?

如何判断变量是数字还是字符串?

什么是 Rakefile?

将字符串与Ruby中的数字连接起来

Ruby:如何计算一个字符串在另一个字符串中出现的次数?

Docker for Mac - mkmf.rb 找不到 ruby​​ 的头文件