Ruby中如何通过变量插值循环操作同系列命名数组?
可以实现,两种方法解决你的问题
方法一:动态获取变量
如果你的数组是实例变量(比如定义成@level_1_foo = []),可以用instance_variable_get方法动态获取变量,再执行添加操作:
(1..5).each do |x| # 拼接变量名并获取对应数组 target_arr = instance_variable_get("@level_#{x}_foo") # 先判断变量存在再添加,避免报错 target_arr << some_value if target_arr end
如果是局部变量(直接定义成level_1_foo = []),需要借助binding对象来获取:
(1..5).each do |x| target_arr = binding.local_variable_get("level_#{x}_foo") target_arr << some_value if target_arr end
你之前尝试的"level_#{x}_foo"只是生成了变量名字符串,并没有实际引用到变量;level_+x+_foo是不符合Ruby语法的写法,所以都没法生效。
方法二:用哈希统一管理(更推荐)
动态调用变量虽然能解决问题,但代码可读性差,后期维护麻烦。更规范的做法是把这些数组放进哈希里,用数字作为键:
# 先把已有的数组存入哈希 level_foos = { 1 => level_1_foo, 2 => level_2_foo, 3 => level_3_foo, 4 => level_4_foo, 5 => level_5_foo } # 循环操作哈希里的数组 (1..5).each do |x| level_foos[x] << some_value end
如果还没创建数组,也可以直接用哈希初始化:
level_foos = (1..5).to_h { |x| [x, []] } (1..5).each do |x| level_foos[x] << some_value end
这种方式代码更清晰,也避免了动态变量带来的潜在问题。
内容的提问来源于stack exchange,提问作者John Cowan
相关产品推荐
相关产品推荐

