采用 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
不返回一个新数组。 每个意味着它将处理数组的每个元素,但最终,它将返回它的接收器。
要从块中打印某些内容,您需要使用print
或puts
.
有几种方法可以分配每个结果:
第一:使用 #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"