如何解决每种方法的动态变量
我有一个要迭代并创建动态变量的数组。此外,我想循环播放。知道如何实现吗?
代码:
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_set和Binding#local_variable_get。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。