访问对象数组中的实例变量值:Ruby

时间:2017-01-10 04:31:46

标签: arrays ruby instance-variables

我有一个带有一个实例变量的对象数组:

oranges_array = 
[#<Orange:0x007faade859ea0 @diameter=2.7>,
 #<Orange:0x007faade859ef0 @diameter=2.8>,
 #<Orange:0x007faade859f40 @diameter=2.6>]

例如,我如何访问直径实例变量?我想最终得到他们的平均值。我是否需要或者我是否在正确的轨道上思考我可能会使用每个循环将每个直径铲到其自己的数组中然后使用inject?或者有更简单的方法来访问直径变量?谢谢!

1 个答案:

答案 0 :(得分:3)

一种选择是将attr_reader添加到Orange类:

class Orange
  attr_reader :diameter
end

现在你可以得到avarage:

avg = oranges_array.map(&:diameter).inject(:+) / oranges_array.size.to_f
# with Ruby 2.4+ you can do the following:
# avg = oranges_array.sum(&:diameter) / oranges_array.size.to_f

另一种选择是使用Object#instance_variable_get(无需将attr_reader添加到班级中:

avg = oranges_array.map { |orange| orange.instance_variable_get(:@diameter) }.inject(:+) / oranges_array.size.to_f

注意:

使用instance_variable_get执行此任务是最后的手段选项,我几乎专门添加它以显示获取对象的实例变量的方法,以防万一例如,无法在类中定义属性读取器。