2010-05-28 4 views
1

мы сделали следующий код и попытались его запустить.бесплатная программа интерфейса в Ruby

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 

такой же, даже если объекты различны. мы заметили, что второй объект i.e 'a' заменяет значение первого объекта, т.е. e. выход выходит быть

42 
90 
90 

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

42 
90 
42 

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

ответ

3

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

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

Edit: Вот более сжато версия Ингредиент, что позволяет Вам экономить писать аксессоров.

class Ingredient 
    attr_accessor :quantity, :name 

    def initialize(n) 
    @name = n 
    end 
end 
+0

Кроме того, если вы используете accesors для количества и имя экземпляра переменных, вы можете просто определить 'attr_accessor: quantity' и' attr_reader: name' и опускаем методы вообще. – Chubas

+0

Истинный, отредактированный, чтобы отразить это. – 2010-05-28 05:53:54

+0

oh..thank вас так много .. мы этого не заметили .. это просто, что мы только что начали с ruby. – intern

Смежные вопросы