Niel има страхотен отговор за това, просто искам да добавя нещо към него.
Броене на кучета :)
Имате нужда от променлива на класа, за да направите това..
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
Има друг начин да направите това с "променливи на екземпляр на обекта Class", но това е малко напреднала тема.
Достъп до променливи на екземпляр
В 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