在Ruby中动态命名变量

时间:2015-05-24 07:26:49

标签: ruby json variables

我正在尝试执行以下操作。

@i, price_0, price_1, price_2 = 0, 0, 0, 0
   until @i > 2 do
     if trade_history[@i]["type"] == 2
       price_"#{@i}" = (trade_history[@i]["xbt_gbp"]).to_f ##NOT WORKING
     end
     @i += 1;
   end

我无法在网上找到任何可以在Ruby中动态命名变量的地方。我想要做的是只要有类型2就提取trade_history对象的价格。我需要能够使用价格变量(price_0..2)在循环结束时进行计算。请帮忙! : - )

2 个答案:

答案 0 :(得分:0)

我不认为这是最好的方法,你应该使用包含价格的Hash,但如果你真的想动态分配你创建的局部变量,请使用binding.local_variable_set

binding.local_variable_set("price_#{@i}", "your value")

请注意,这仅适用于Ruby 2.1。有关详细信息,请参阅How to dynamically create a local variable?

如果您更喜欢实例变量,可以使用。

instance_variable_set("@price_#{@i}", 1)

答案 1 :(得分:0)

只需将值存储在数组中:

prices = []
3.times do |i|
  history = trade_history[i]
  prices << history["xbt_gbp"].to_f if history["type"] == 2
end

在此循环之后,prices数组将保存结果,如下所示:

prices    
#=> e.q. [0.2, 0.4, 0.5] 

使用reduceinject

可以轻松完成计算
prices.inject(:+)
#=> 1.1