Чтение онлайн

на главную - закладки

Жанры

Программирование на языке 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
. Классы в этом языке всегда конкретны, абстрактных классов не существует. Однако теоретически можно реализовать и абстрактные классы, если вам это для чего-то понадобится.

Поделиться:
Популярные книги

На границе империй. Том 10. Часть 10

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 10

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Матабар V

Клеванский Кирилл Сергеевич
5. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар V

Мечник Вернувшийся 1000 лет спустя

Ткачев Андрей Юрьевич
1. Вернувшийся мечник
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Мечник Вернувшийся 1000 лет спустя

Глубокий космос

Вайс Александр
9. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Глубокий космос

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Индульгенция 1. Без права выбора

Машуков Тимур
1. Темный сказ
Фантастика:
аниме
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Индульгенция 1. Без права выбора

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Звездная Кровь. Изгой V

Елисеев Алексей Станиславович
5. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
фантастика: прочее
5.00
рейтинг книги
Звездная Кровь. Изгой V

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь