Программирование на языке Ruby
Шрифт:
Поскольку данные уровня класса доступны во всем классе, их можно инициализировать в момент определения класса. Если определен метод с именем
initialize
, то гарантируется, что он будет вызван сразу после выделения памяти для объекта. Этот метод похож на традиционный конструктор, но не выполняет выделения памяти. Память выделяется методом new
, а освобождается неявно сборщиком мусора. Теперь взгляните на следующий фрагмент, обращая особое внимание на методы
getmyvar
, setmyvar
и myvar=
:
class MyClass
NAME = "Class Name" # константа класса
@@count = 0 # инициализировать переменную класса
def initialize # вызывается после выделения памяти для объекта
@@count += 1
@myvar = 10
end
def MyClass.getcount # метод класса
@@count # переменная класса
end
def getcount # экземпляр возвращает переменную класса!
@@count # переменная класса
end
def getmyvar # метод экземпляра
@myvar # переменная экземпляра
end
def setmyvar(val) # метод экземпляра устанавливает @myvar
@myvar = val
end
def myvar=(val) # другой способ установить @myvar
@myvar = val
end
end
foo = MyClass.new # @myvar равно 10
foo.setmyvar 20 # @myvar равно 20
foo.myvar =30 # @myvar равно 30
Здесь мы видим, что
getmyvar
возвращает значение переменной @myvar
, а setmyvar
устанавливает его. (Многие программисты говорят о методах чтения и установки). Все это работает, но не является характерным способом действий в Ruby. Метод myvar=
похож на перегруженный оператор присваивания (хотя, строго говоря, таковым не является); это более удачная альтернатива setmyvar
, но есть способ еще лучше. Класс
Module
содержит методы attr
, attr_accessor
, attr_reader
и attr_writer
. Ими можно пользоваться (передавая символы в качестве параметров) для автоматизации управления доступом к данным экземпляра. Например, все три метода getmyvar
, setmyvar
и myvar=
можно заменить одной строкой в определении класса:
attr_accessor :myvar
При этом создается метод
myvar
, который возвращает значение @myvar
, и метод myvar=
, который позволяет изменить значение той же переменной. Методы attr_reader
и attr_write
r создают соответственно версии методов доступа к атрибуту для чтения и для изменения. Внутри методов экземпляра, определенных в классе, можно при необходимости пользоваться переменной
self
. Это просто ссылка на объект, от имени которого вызван метод экземпляра. Для управления видимостью методов класса можно пользоваться модификаторами
private
, protected
и public
. (Переменные экземпляра всегда закрыты, обращаться к ним извне класса можно только с помощью методов доступа.) Каждый модификатор принимает в качестве параметра символ, например :foo
, а если он опущен, то действие модификатора распространяется на все последующие определения в классе. Пример:
class MyClass
def method1
# ...
end
def method2
# ...
end
def method3
# ...
end
private :method1
public
:method2
protected :method3
private
def my_method
# ...
end
def another_method
# ...
end
end
В этом классе метод
method1
закрытый, method2
открытый, a method3
защищенный. Поскольку далее вызывается метод private
без параметров, то методы my_method
и another_method
будут закрытыми. Уровень доступа
public
не нуждается в объяснениях, он не налагает никаких ограничений ни на доступ к методу, ни на его видимость. Уровень private
означает, что метод доступен исключительно внутри класса или его подклассов и может вызываться только в «функциональной форме» от имени self
, причем вызывающий объект может указываться явно или подразумеваться неявно. Уровень protected
означает, что метод вызывается только внутри класса, но, в отличие от закрытого метода, не обязательно от имени self
. По умолчанию все определенные в классе методы открыты. Исключение составляет лишь
initialize
. Методы, определенные на верхнем уровне программы, тоже по умолчанию открыты. Если они объявлены закрытыми, то могут вызываться только в функциональной форме (как, например, методы, определенные в классе Object
). Классы в Ruby сами являются объектами — экземплярами метакласса
Class
. Классы в этом языке всегда конкретны, абстрактных классов не существует. Однако теоретически можно реализовать и абстрактные классы, если вам это для чего-то понадобится.
Поделиться:
Популярные книги
Черный Маг Императора 13
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Мрак
Фантастика:
постапокалипсис
5.00
рейтинг книги
Иной. Том 1. Школа на краю пустыни
1. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.75
рейтинг книги
Я уже граф. Книга VII
7. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Deus vult
9. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
На цепи
1. На цепи
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Камень Книга седьмая
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Воин
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Мастеровой
Фантастика:
фэнтези
боевая фантастика
альтернативная история
7.40
рейтинг книги
Черный Маг Императора 16
16. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Тихие ночи
2. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Адаптация
1. Другая сторона
Фантастика:
фэнтези
6.33
рейтинг книги
Князь Андер Арес 4
4. Андер Арес
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Двойник короля 20
20. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00