2016-11-09 8 views
3

コンストラクタを持つSquareスクエアの作成と、四角形の面積を計算するためのメソジオ。オブジェクトのRuby配列

class Square 
    def initialize(side) 
    @side = side 
    end 

    def printArea 
    @area = @side * @side 
    puts "Area is: #{@area}" 
    end 
end 

2つのオブジェクトを作成し、私は、配列内のオブジェクトをアクセスもどうすればよいのアレイ

array = [] 
array << Square.new(4) 
array << Square.new(10) 

for i in array do 
    array[i].printArea 
end 

に追加しますか?私はエラーが発生します:正方形の整数への暗黙的な変換はありません。

+0

'array.push Square.new(4)、Square.new(10) ' –

答えて

4

forは、Rubyコードではほとんど使用されていません。アレイ全体

array.each do |square| 
    square.printArea 
end 

この繰り返し処理をし、あなたのコードが同様に何をするかである各squareオブジェクトを返します。その代わりに、記述します。 iはインデックスではなく、配列内の要素です。

Rubyは、メソッド名と変数の形式がprint_areaであることを強く推奨しています。このコードの

よりRubyのフォームは次のようになります。

class Square 
    attr_accessor :side 

    def initialize(side) 
    @side = side.to_i 
    end 

    def area 
    @side * @side 
    end 
end 

squares = [ ] 
squares << Square.new(10) 
squares << Square.new(20) 

squares.each do |square| 
    puts 'Square of side %d has area %d' % [ square.side, square.area ] 
end 

これは、あなたが他のものに焦点を当てされなければならないモデルのご表示ロジック外を統合します。

+0

ありがとう、私はそれが簡単だったと信じられない。私は通常、それぞれとの間で交替しますが、私は今のところそれぞれを使用します。あなたの提案を書き留めて、私はコードを改善することができます。 –

+0

'area'メソッドを' side * side'と書く方が良いでしょうか? –

+0

優先事項。 '@side * @ side'は少し速くなりますが、ほとんどの場合は無関係です。 'side * side'はまったく同じように動作します。 – tadman

3

私はあなたが言いたいと考えている:

array.each do |sq| 
    sq.printArea 
end 
5

他の回答には、修正するために何をすべきかを説明しました。私はあなたがそのエラーを持っている理由を説明しようと思います。あなたのコードに

ご注意:

array = [] 
array << Square.new(4) 
array << Square.new(10) 

for i in array do 
    array[i].printArea 
end 

あなたは空の配列を作成し、右、それに2つのスクエアのインスタンスを挿入?

for i in array doと書いたときに、iには何が含まれていると思いますか?もちろん、iarrayに格納します。つまり、iにはSquareインスタンスが含まれています。あなたはそれを言っている! i in arrayは、iは配列の位置の内容であり、そのインデックスではありません。

あなたは

for i in array do 
    p i.class 
end 

を書く場合は、Rubyが唯一の配列インデックスとして整数を受け入れることが起こる

Square 
Square 

のようなものが表示されます。そして、array[i]と言ったとき、実際にはarray[Square]のようなものを言っていました。そしてRubyはそれらのSquareオブジェクトを整数として見て、配列インデックスとして使用しようとしていました。 no implicit conversion of Square into Integerがあるので、もちろん失敗しました。これはあなたが持っているエラーです。

私はこれについてもう少し詳しく説明します。これは私のブログのthis articleです。