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

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

Жанры

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

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

Антимаг его величества. Том V

Петров Максим Николаевич
5. Модификант
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Антимаг его величества. Том V

Уникум

Поселягин Владимир Геннадьевич
1. Уникум
Фантастика:
альтернативная история
4.60
рейтинг книги
Уникум

Лекарь Империи 9

Карелин Сергей Витальевич
9. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
Лекарь Империи 9

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Последний Паладин. Том 13

Саваровский Роман
13. Путь Паладина
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 13

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

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

Адвокат Империи 6

Карелин Сергей Витальевич
6. Адвокат империи
Фантастика:
городское фэнтези
аниме
дорама
попаданцы
5.00
рейтинг книги
Адвокат Империи 6

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Тайны затерянных звезд. Том 1

Лекс Эл
1. Тайны затерянных звезд
Фантастика:
боевая фантастика
космическая фантастика
фэнтези
5.00
рейтинг книги
Тайны затерянных звезд. Том 1

Адвокат Империи 8

Карелин Сергей Витальевич
8. Адвокат империи
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
фантастика: прочее
попаданцы
5.00
рейтинг книги
Адвокат Империи 8

Очкарик 2

Афанасьев Семен
2. Очкарик
Фантастика:
фэнтези
альтернативная история
5.00
рейтинг книги
Очкарик 2

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Лекарь Империи

Карелин Сергей Витальевич
1. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи