У Нила есть отличный ответ на этот вопрос, я просто хочу добавить к нему кое-что.
Считать собак :)
Для этого вам нужна переменная класса.
class Dog
@@count = 0 # this is a class variable; all objects created by this class share it
def initialize
@@count += 1 # when we create a new Dog, we increment the count
end
def total
@@count
end
end
Есть еще один способ сделать это с «переменными экземпляра объекта класса», но это немного сложная тема.
Доступ к переменным экземпляра
В Ruby переменные — это просто ссылки на объекты/экземпляры.
> x = 1
=> 1
> x.class
=> Fixnum
> 1.instance_variables
=> []
x является ссылкой на объект '1', который является экземпляром класса Fixnum. Объект '1' является экземпляром Fixnum, который не содержит никаких переменных экземпляра. Это ничем не отличается от ссылки на новый экземпляр «Собака».
Точно так же вы можете сказать x = Dog.new
, тогда x является ссылкой на экземпляр класса Dog.
class Dog
attr_accessor :legs # this defines the 'legs' and 'legs=' methods!
end
x = Dog.new
x.instance_variables
=> [] # if you would assign legs=4 during "initialize", then it would show up here
x.legs = 4 # this is really a method call(!) to the 'legs' method
x.instance_variables # get created when they are first assigned a value
=> [:legs]
Неважно, передаете ли вы такую ссылку вызову метода, другому классу или просто оцениваете ее саму по себе — Ruby знает, что это ссылка на объект, и смотрит внутрь объекта и его цепочку наследования, чтобы решить проблемы.
Разрешение имен методов
Это была лишь частичная правда :) При интерпретации x.legs
Ruby проверяет, есть ли в цепочке наследования классов объекта метод, который отвечает на это имя «ноги». Это не волшебный доступ к переменной экземпляра с тем же именем!
Мы можем определить метод «ноги», выполнив «attr_reader:legs» или «attr_accessor:legs», или сами определив метод.
class Dog
def legs
4 # most dogs have 4 legs, we don't need a variable for that
end
end
x.legs # this is a method call! it is not directly accessing a :legs instance variable!
=> 4
x.instance_variables
=> [] # there is no instance variable with name ":legs"
и если мы попытаемся реализовать его как метод и переменную экземпляра, произойдет следующее: :)
class Dog
attr_accessor :legs # this creates "def legs" and "def legs=" methods behind the scenes
def legs # here we explicitly override the "def legs" method from the line above.
4
end
end
x = Dog.new
x.legs # that's the method call we implemented explicitly
=> 4
x.legs = 3 # we can still assign something to the instance_variable via legs=
=> 3
x.legs # the last definition of a method overrides previous definitions
# e.g. it overrides the automatically generated "legs" method
=> 4
attr_accessor :legs
— это просто краткая запись для этого:
class Dog
def legs
@legs
end
def legs=(value)
@legs = value
end
end
не существует волшебного способа автоматического доступа к переменной экземпляра. Доступ к ним всегда осуществляется через метод, который можно переопределить позже.
Я надеюсь, что это имеет смысл для вас
person
Tilo
schedule
07.03.2013