Ruby的reduce方法使用花括号时是否会隐式返回累加器?
问题核心原因
reduce的运行逻辑不会随累加器类型变化,你遇到的报错和使用花括号还是do...end无关,核心是reduce要求每轮迭代的块必须返回下一轮要使用的累加器,不存在默认隐式返回原有累加器的规则。
错误复现原理
你第一种写法的块代码:
{ |hash,word| hash[word] = word.length }
Ruby中赋值表达式的返回值是等号右侧的值,也就是word.length(整数类型)。第一轮迭代结束后,块返回的整数会被当作下一轮的累加器传入,第二轮迭代时参数hash拿到的是上一轮返回的整数,调用[]=方法自然就报undefined method '[]=' for 3:Integer的错误。
你之前写的数值累加示例能正常运行,只是刚好巧合:sum + number的返回值正好就是下一轮需要的数值累加器,刚好符合reduce的要求,才让你误以为reduce会隐式保留累加器。
验证方案
你只要修改花括号写法,让块显式返回哈希对象,就能正常运行,和do...end写法效果完全一致:
def find_word_lengths(word_list) word_list.reduce(Hash.new(0)) { |hash,word| hash[word] = word.length; hash } end
内容的提问来源于stack exchange,提问作者charmingduchess
相关产品推荐
相关产品推荐

