свободная интерфейсная программа на Ruby - PullRequest
1 голос
/ 28 мая 2010

мы сделали следующий код и пытаемся его запустить.

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

одинаково, даже если объекты разные. мы наблюдали, что второй объект, то есть «а», заменяет значение первого объекта, то есть «е». выход будет

42
90
90

, но требуется вывод

42
90
42

Кто-нибудь может подсказать, почему это происходит? он не заменяет объект, так как идентификаторы объекта отличаются ... только значения объектов заменяются.

1 Ответ

3 голосов
/ 28 мая 2010

Проблема в том, что вы используете переменную класса @@quantity вместо переменной экземпляра @quantity. Существует только один класс Ingredient, поэтому эта переменная является общей для всех экземпляров. Просто удалите лишний знак @, и он будет вести себя так, как вы ожидаете; есть один @quantity на каждый экземпляр Ingredient.

См. http://www.techotopia.com/index.php/Ruby_Variable_Scope#Ruby_Class_Variables

Edit: вот более лаконичная версия Ingredient, которая избавляет вас от необходимости писать аксессоры.

class Ingredient
  attr_accessor :quantity, :name

  def initialize(n)
    @name = n
  end
end
...