2017-01-10 10 views
0

私は1つのインスタンス変数を持つオブジェクトの配列があります。たとえばAccessインスタンス変数の値:ルビー

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

を、どのように私は、直径インスタンス変数にアクセスするのでしょうか?私は最終的に平均を得たいと思う。私は、それぞれのループを使用して各直径を独自の配列にしてからinjectを使用すると思っていますか?または、直径変数にアクセスする簡単な方法がありますか?ありがとう!

+3

私はあなたの質問に答えを受け入れることはないことに気付きました。あなたの質問をしばらく見直して、彼らがあなたの質問を解決した場合に最良の答えを受け入れるようにしてください。この方法でコミュニティに知らせると、問題が解決され、同時にソリューション –

+0

を提供した方の努力に報いることができます。ちょうど私の質問を通過する。申し訳ありません。このサイトに対する私の愛は成長し、私はより良い礼儀を学びました。今私はちょうど戻って、それが原因でどこにクレジットを与えるしようとしています! –

答えて

3

1つのオプションはOrangeクラスにattr_readerを追加することです:

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 

別のオプションはにattr_readerを追加することなく(Object#instance_variable_getを使用することですクラス:

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

注:このタスクのためinstance_variable_getを使用して

最後オプションであり、私は属性の読者を定義する方法は、例えば、存在しない場合には、オブジェクトのインスタンス変数を取得する方法があります表示するには、ほぼ独占的にこれを追加しましたクラスで。

+0

'instance_variable_get'を使うことは、オブジェクト指向の設計の観点からすると非常に失礼なことです。あなたは別のオブジェクトのプライベートデータを使いこなしています。ここでの 'attr_reader'アプローチは最高ですが、これを正しく解決するには本当に唯一の方法です。後者は最後の緊急オプションです。 – tadman

+0

@tadmanは、代替オプションを表示するためにほとんど排他的に投稿しました(例えば、ユーザーが 'orange'に' attr_reader'を追加する機会がない場合)。しかし、 'instance_variable_get'がここに行く方法ではないことに私は同意します。 –

+1

ええ、私は同意します、人々が*アイデア*を得る場合にそれを警告するだけです。 – tadman

関連する問題