1

次のコードを作成して実行しようとしました。

class Numeric
def gram 
self
end
alias_method :grams, :gram

def of(name)
    ingredient = Ingredient.new(name)
    ingredient.quantity=self
    return ingredient
  end
end


class Ingredient 
      def initialize(n)
        @@name= n
        end

      def quantity=(o)
      @@quantity = o
       return @@quantity
     end

     def name
       return @@name
     end

     def quantity
       return @@quantity
     end

   end

e= 42.grams.of("Test")
a= Ingredient.new("Testjio")
puts e.quantity
a.quantity=90
puts a.quantity
puts e.quantity

私たちが直面している問題は、

puts a.quantity
puts e.quantity

オブジェクトが異なっていても同じです。私たちが観察したのは、2番目のオブジェクト(つまり「a」)が最初のオブジェクト(つまり「e」)の値を置き換えているということです。出力は次のようになります

42
90
90

しかし、必要な出力は

42
90
42

なぜそれが起こっているのか誰かが提案できますか?オブジェクトIDが異なるため、オブジェクトは置き換えられません。オブジェクトの値のみが置き換えられます。

4

1 に答える 1

3

@@quantity問題は、インスタンス変数の代わりにクラス変数を使用していることです@quantityクラス は1つしかないIngredientため、変数はインスタンス間で共有されます。余分な@記号を削除するだけで、期待どおりに動作します。@quantityのインスタンスごとに1つありますIngredient

http://www.techotopia.com/index.php/Ruby_Variable_Scope#Ruby_Class_Variablesを参照してください

編集:これは、アクセサーを作成する手間を省く、より簡潔なバージョンのIngredientです。

class Ingredient
  attr_accessor :quantity, :name

  def initialize(n)
    @name = n
  end
end
于 2010-05-28T05:41:47.213 に答える