0

わかりました、私は答えを求めるためにここにいるのではありません。しかし、正直なところ、私はクラス変数があまり得意ではありません。ですから、このコードで私を案内していただければ幸いです。

これらのドキュメントでクラス変数を読みました。私はそれをどういうわけか理解しています。しかし、それは私自身の使用のためにそれを適用することになります。私は混乱するでしょう。

class Square

   @@sqArray = {}

    #attr_accessor :length

   def initialize
      if defined?(@@length)
        randno = "%s" % [rand(20)]
        @@length = randno.to_i
        @@sqArray = @@length

    else 
        randno = "%s" % [rand(20)]
        @@length = randno.to_i
        @@sqArray = @@length
    end
   end

   def Area
         @@area = @@length * @@length
         return @@area
         @@sqArray[@@length.to_sym] = @@area
         puts @@sqArray
   end  
   end

        s1 = Square.new
        puts s1.Area

このコードについて説明します。基本的に、Square オブジェクトを作成するたびに、initialize メソッドに移動します。乱数が生成されて @@length に渡され、@@length がハッシュ @@sqArray にキーとして割り当てられます。しかし、問題は、新しいオブジェクト s1 を作成するときです。エリアを表示したいときは、ハッシュ @@sqArray をテストして、長さをキーとして、面積を値として出力します。しかし今、問題はその領域のみを返すことだけです。たとえば、114 のみ。たとえば [ 24 => 114] であるとします。

4

1 に答える 1

1

オブジェクトのプロパティ (つまりlength) を定義するときの正しいアプローチは、クラス変数ではなくインスタンス変数を使用することです。これは、(あなたの特定の例では)lengthが特定の属性であり、squareすべての正方形に適用されるものではないためです。コードは次のようになります。

class Square
  def initialize(length = rand(20))
    @length = length
  end

  def area
    @length * @length
  end
end

s1 = Square.new
puts s1.area

さて、そのクラス変数を使用して正確に何を達成しようとしているのかは少しわかりません@@sqArrayが、たとえば、このストアを使用して、定義されたすべてSquareの s のリストを使用できます。

class Square
  @@squares_list = []
  def self.all_known
    @@squares_list
  end

  def initialize(length = rand(20))
    @length = length
    @@squares_list << self
  end

  def area
    @length * @length
  end
end

これにより、次のようなコードを記述できます。

s1 = Square.new     #=> #<Square:0x0000000132dbc8 @length=9>
s2 = Square.new(20) #=> #<Square:0x000000012a1038 @length=20>
s1.area             #=> 81
s2.area             #=> 400
Square.all_known    #=> [#<Square:0x0000000132dbc8 @length=9>, #<Square:0x000000012a1038 @length=20>]

ただし、クラス変数には奇妙な動作があり、使用例が限られています。一般的に、Ruby の学習を開始するときはそれらを避けることをお勧めします。ruby スタイル ガイドを読んで、変数/メソッドの命名 (またはを使用しsnake_caseない)、空白など、ベスト プラクティスに関するいくつかの一般的な規則を確認してください。camelCasePascalCase

于 2017-01-03T10:39:21.667 に答える