Ruby中调用Hash的each方法时,块内能否简写引用该Hash?
问题解答
1. 块内是否有简写引用@something?
在你给出的each块写法里,没有直接的简写方式来指代调用each的@something本身——因为each的块参数只传递了键值对(k,v),并没有提供调用者的引用。
不过可以换个思路简化操作:
- 提前把
@something赋值给局部变量,减少重复书写:h = @something h.each { |k, v| h[k] = v*2 } - 更推荐用Ruby内置的
transform_values!方法,完全不需要在块里引用哈希本身,直接原地修改值:@something.transform_values! { |v| v*2 }
2. reduce或转数组map是不是糟糕方案?
- 转数组用
map:如果需求是生成新哈希而非原地修改,@something = @something.to_a.map { |k,v| [k, v*2] }.to_h是可行的,但确实不够简洁——Ruby已经提供了transform_values(生成新哈希)来做这件事,没必要绕弯转数组。但如果是特定场景下需要操作数组形式的键值对,这也不算“糟糕”,只是非最优解。 - 用
reduce:如果只是为了规避引用@something而用reduce,比如@something = @something.reduce({}) { |acc, (k,v)| acc[k] = v*2; acc },那确实属于增加不必要复杂度的方案。reduce更适合需要逐步累加复杂逻辑的场景,单纯的键值转换用它完全是大材小用,不如transform_values或map直接。
内容的提问来源于stack exchange,提问作者willyab
相关产品推荐
相关产品推荐

