如何重构Ruby中带自动分页判断的遍历代码,用send传块有何技巧
Ruby代码重构方案
核心实现逻辑
Ruby的send/public_send方法原生支持调用时直接传递块,和普通方法调用的传块语法完全一致,完全可以满足你的需求,不需要额外处理块传递的逻辑。
方案1:兼容原有数组变量的最简重构
如果你的arr变量在方法前序逻辑中已经完成初始化,直接用动态方法名+统一块即可消除重复分支:
def some_method iter_method = auto_pagination ? :auto_paging_each : :each customers_list.send(iter_method) do |customer| arr << importer.extract(customer) end end
- 删掉了完全重复的块内逻辑,代码长度直接缩短一半以上
- 不需要额外处理块传递,和普通调用方法的传块规则完全相同
方案2:适用于数组在本方法内初始化的场景
如果arr是本方法内才需要生成的数组,可以用with_object进一步省略数组提前声明的步骤:
def some_method iter_method = auto_pagination ? :auto_paging_each : :each arr = customers_list.send(iter_method).with_object([]) do |customer, arr| arr << importer.extract(customer) end end
安全优化提示
如果担心send会调用到非公开方法引发安全问题,可以替换为public_send,仅允许调用对象的公开方法,逻辑完全不变。
内容的提问来源于stack exchange,提问作者sebassebas1313
相关产品推荐
相关产品推荐

