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

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

Жанры

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

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

Поэтика Ф. М. Достоевского: опыт интерпретации

Тяпугина Наталия Ю.
Научно-образовательная:
языкознание
7.00
рейтинг книги
Поэтика Ф. М. Достоевского: опыт интерпретации

Бастард Императора. Том 14

Орлов Андрей Юрьевич
14. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 14

Геррон

Левински Шарль
Проза:
современная проза
7.71
рейтинг книги
Геррон

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Ведьмак (сборник)

Сапковский Анджей
Фантастика:
фэнтези
6.67
рейтинг книги
Ведьмак (сборник)

Сага о Копье: Омнибус. Том I

Уэйс Маргарет
1. Сага о Копье
Фантастика:
фэнтези
6.25
рейтинг книги
Сага о Копье: Омнибус. Том I

Новые Миры Роберта Шекли. Том 1

Шекли Роберт
Фантастика:
научная фантастика
5.00
рейтинг книги
Новые Миры Роберта Шекли. Том 1

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Буря Жнеца

Эриксон Стивен
7. «Малазанская империя»
Фантастика:
фэнтези
6.60
рейтинг книги
Буря Жнеца

Крейсер «Очаков»

Мельников Рафаил Михайлович
Боевые корабли мира
Научно-образовательная:
история
военная история
5.00
рейтинг книги
Крейсер «Очаков»

Угрюм-река

Шишков Вячеслав Яковлевич
Проза:
историческая проза
9.07
рейтинг книги
Угрюм-река

Симфонии

Белый Андрей
Поэзия:
поэзия
6.25
рейтинг книги
Симфонии

Барон Бранд Берс. Том 2

Limonad
2. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Барон Бранд Берс. Том 2

Дракон поверженный

Гамильтон Питер Ф.
Фантастика:
научная фантастика
5.00
рейтинг книги
Дракон поверженный