如何在 ruby​​ 中动态初始化实例变量?

时间:2021-02-02 00:37:55

标签: ruby

使用内插字符串是否可以在彼此内部调用多个 #{}?

例如,我想创建一个变量并在末尾添加一个数字。我还想附加站点中一列的结果,但也要增加数字。执行以下代码的最佳方法是什么?

@site.each do |site|
  1.upto(4) do |i|
    eval("@var#{i} = #{site.site_#{i}_location}", b)
  end
end

所以@var1 = site.site_1_location,@var2 = site.site_2_location,等等

3 个答案:

答案 0 :(得分:2)

模拟@sites 数据:

@sites = [OpenStruct.new(
  site_1_location: 'Japan',
  site_2_location: 'India',
  site_3_location: 'Chile',
  site_4_location: 'Singapore'
)]

可以使用instance_variable_set来设置实例变量

@sites.each do |site|
  1.upto(4) do |i|
    instance_variable_set("@var#{i}", site.send("site_#{i}_location"))
  end
end

现在您可以访问变量了:

@var1 # returns "Japan"
@var2 # returns "India"
@var3 # returns "Chile"
@var4 # returns "Singapore"

答案 1 :(得分:0)

使用 #send 可能会有所帮助

code = "@var#{i} = site.send(:site_#{i}_location)"

eval(code)

答案 2 :(得分:0)

当然,可以嵌套 #{}。 愚蠢的例子,但它显示了嵌套的可能性:

x = 1
y = 2
"abc_#{"#{x}_#{y if y > 1}"}"
# => 'abc_1_2'

无论如何,Imram Ahmad (https://stackoverflow.com/a/66002619/14485176) 建议的代码解决方案是解决问题的更好方法!

相关问题