红宝石中方法块的返回值分配

问题描述 投票:0回答:1

参考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也不返回任何东西。这里发生了什么?

从块中分配处理后的值的最优雅的方法是什么?猴子可以打补丁吗?

其他信息:我正在使用ruby 2.6.3

((注:我已经看到了[Ed的问题],但是尽管在2017年的结论是使用赋值运算符会导致语法错误,但在Array#each的情况下,ruby显然不会表现出这样的行为。)]] >

参考String#each_char的ruby API文档解释,它表明当与给定的块一起调用此方法时,会收到一个字符串。 each_char {| cstr | block}→str但是...

ruby return-value each block enumerable
1个回答
0
投票

首先,#each不返回新数组。每个都意味着它将处理数组的每个元素,但最后它将返回自身。

© www.soinside.com 2019 - 2024. All rights reserved.