Ruby中如何将动态整数值插值到局部变量名替代分支判断?
问题描述
我定义了以下局部变量:
banana_charge_1_bananas_sold = 0 banana_charge_2_bananas_sold = 0 banana_charge_3_bananas_sold = 0 banana_charge_4_bananas_sold = 0 banana_charge_5_bananas_sold = 0
同时存在sale_ticket.banana_charge,其值为1到5之间的整数。
是否可以将sale_ticket.banana_charge插值到局部变量名中,以此替代如下冗长的分支判断代码:
if sale_ticket.banana_charge == 1 banana_charge_1_bananas_sold += number_of_scanned_bananas elsif sale_ticket.banana_charge == 2 banana_charge_2_bananas_sold += number_of_scanned_bananas # ...以此类推 end
实现类似如下的写法:
banana_charge_&^{sale_ticket.banana_charge}_bananas_sold += number_of_scanned_bananas
解决方案
直接通过字符串插值动态操作局部变量名的做法不推荐,会降低代码可读性,不利于后续维护调试。更合理的方式是用**哈希(Hash)**替代多个独立局部变量,通过键值对直接定位更新数据:
1. 用哈希初始化数据
banana_sold_counts = { 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0 }
2. 简化更新逻辑
直接以sale_ticket.banana_charge作为哈希的键,就能完成对应数值的累加,彻底替代冗长的分支判断:
banana_sold_counts[sale_ticket.banana_charge] += number_of_scanned_bananas
补充:动态操作局部变量的方法(不推荐)
如果一定要实现动态访问局部变量的需求,可以使用binding.local_variable_get和binding.local_variable_set,但这种写法会让代码晦涩难懂:
charge_num = sale_ticket.banana_charge var_name = "banana_charge_#{charge_num}_bananas_sold" current_value = binding.local_variable_get(var_name) binding.local_variable_set(var_name, current_value + number_of_scanned_bananas)
依然强烈建议优先使用哈希方案,代码更清晰,也符合Ruby编码规范。
内容的提问来源于stack exchange,提问作者daveasdf_2
相关产品推荐
相关产品推荐

