访问对象数组中的实例变量值:Ruby
Access instance variable values in array of objects: Ruby
我有一组带有一个实例变量的对象:
oranges_array =
[#<Orange:0x007faade859ea0 @diameter=2.7>,
#<Orange:0x007faade859ef0 @diameter=2.8>,
#<Orange:0x007faade859f40 @diameter=2.6>]
例如,我将如何访问直径实例变量?我想最终得到他们的平均值。我是否需要或者我是否在正确的轨道上思考我可能使用每个循环将每个直径铲到它自己的数组然后使用 inject
?或者是否有更简单的方法来访问直径变量?谢谢!
一个选项是将 attr_reader
添加到 Orange
class:
class Orange
attr_reader :diameter
end
现在你可以获得平均值:
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
添加到 class:
avg = oranges_array.map { |orange| orange.instance_variable_get(:@diameter) }.inject(:+) / oranges_array.size.to_f
注意:
为此任务使用 instance_variable_get
是 最后的选择 选项,我添加它几乎完全是为了表明有一种方法可以获取对象的实例变量,以防万一,例如,无法在 class.
中定义属性读取器
我有一组带有一个实例变量的对象:
oranges_array =
[#<Orange:0x007faade859ea0 @diameter=2.7>,
#<Orange:0x007faade859ef0 @diameter=2.8>,
#<Orange:0x007faade859f40 @diameter=2.6>]
例如,我将如何访问直径实例变量?我想最终得到他们的平均值。我是否需要或者我是否在正确的轨道上思考我可能使用每个循环将每个直径铲到它自己的数组然后使用 inject
?或者是否有更简单的方法来访问直径变量?谢谢!
一个选项是将 attr_reader
添加到 Orange
class:
class Orange
attr_reader :diameter
end
现在你可以获得平均值:
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
添加到 class:
avg = oranges_array.map { |orange| orange.instance_variable_get(:@diameter) }.inject(:+) / oranges_array.size.to_f
注意:
为此任务使用 instance_variable_get
是 最后的选择 选项,我添加它几乎完全是为了表明有一种方法可以获取对象的实例变量,以防万一,例如,无法在 class.