每种方法的动态变量

问题描述

我有一个要迭代并创建动态变量的数组。此外,我想循环播放。知道如何实现吗?

代码:

collection = ["s","g","l"]

collection.each do |variable_name|
   devan_'#{variable_name}' = ['h1','h2','h3']
   devan_'#{variable_name}'.each do |s1|
     puts "from #{variable_name} we got #{s1}"
   end
end

例外

 syntax error,unexpected '=',expecting end
   devan_'#{variable_name}' = ['h1','h3']

解决方法

正如其他评论者所建议的那样,您可能需要散列而不是动态变量:

collection = ["s","g","l"]

collection.each do |key|
   devan[key] = ['h1','h2','h3']
   devan[key].each do |s1|
     puts "from #{key} we got #{s1}"
   end
end

使用散列,您可以免费获得大量易于​​使用的方法,否则使用动态变量将更加麻烦。例如:

# Add an element to the array for the 's' key:
devan['s'].push 'h4'

# Add an element to the array for each key:
devan.each_key { |k| devan[k].push 'h5' }

# Print array length for each key:
devan.each { |k,v| puts v.length }
,

从块内部设置动态实例变量

在Ruby中,您尝试执行的元编程类型必须与某些其他语言有所不同。在Ruby中,您不能简单地将字符串附加到赋值左侧的变量名上,并将其识别为当前名称空间中的有效变量。当涉及示波器门时,这甚至会带来更多问题。即使它起作用了,您最终也会遇到在当前块之外不存在的块局部变量。

作为如何解决该语言设计选择的一个示例,请考虑以下动态方法:利用Object#instance_variable_set来定义变量,并使用Object#instance_variable_get来读取变量:

%w[s g l].map do |ext|
  varname = "@devan_#{ext}"
  instance_variable_set varname,['h1','h3']
  puts "#{varname} = #{instance_variable_get varname}"
end

[@devan_s,@devan_g,@devan_l]
#=> [["h1","h2","h3"],["h1","h3"]]

通过使用这种方法来设置或读取实例变量,您可以将字符串插值作为参数传递,而不是作为赋值或方法调用的左侧元素。您只需要使用前导@符号来命名变量。

通过使用实例变量,您还可以确保在本地块范围之外创建(并继续使用)新变量。如果这实际上不是您想要的,请考虑改用Binding#local_variable_setBinding#local_variable_get

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...