在 ruby 中分配方法块的返回值



采用 String#each_char 的 ruby API 文档解释,它建议在调用此方法和给定块时收到一个字符串。

each_char {|cstr| block } → str

但是在 irb 中执行此操作时,输出不符合预期,只返回我们开始时的字符串。

irb(main):001:0> v = "foobar".each_char { |c| c + "." }
=> "foobar"

这导致的问题是,分配此方法调用是非常具有欺骗性的,因为它不返回预期的结果,而只是返回我们开始的字符串:

irb(main):002:0> puts v
foobar
=> nil

使用break指令是在变量赋值期间从块返回值的唯一方法。

irb(main):003:0> v = "foobar".each_char { |c| break c + "." }
=> "f."

问题:

为什么使用块调用的方法不返回它们计算的值?这只是此实现的一个特例,因为我确信 Array#each 确实返回一个新的数组。但话又说回来,String#each_byte 也没有返回任何内容。这是怎么回事?

从块中分配已处理值的最优雅方法是什么? 猴子打补丁是一种选择吗?

附加信息: 我正在使用红宝石 2.6.3

(注意:我已经看到了[Ed的这个问题],但是虽然2017年的结论是使用赋值运算符会导致语法错误,但Ruby在Array#each的情况下显然不会这样做。

首先,#each不返回一个新数组。 每个意味着它将处理数组的每个元素,但最终,它将返回它的接收器。

要从块中打印某些内容,您需要使用printputs.

有几种方法可以分配每个结果:

第一:使用 #with_object

=> v = "foobar".each_char.with_object('') { |c, obj| obj << c + '.'  }
=> v
=> "f.o.o.b.a.r."

还有一个:使用#chars#join

=> v = "foobar".chars.join('.')
=> v
=> "f.o.o.b.a.r"