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

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

Жанры

Программирование на языке Ruby
Шрифт:

# Поприветствовать так, как принято в суперклассе.

say_hi

 end

end

У наследования есть разные тонкости, которых мы здесь касаться не будем. Общий принцип мы изложили, но не пропустите следующий раздел.

11.1.6. Опрос класса объекта

Часто возникает вопрос: «Что это за объект? Как он соотносится с данным классом?» Есть много способов получить тот или иной ответ.

Во-первых, метод экземпляра

class
всегда возвращает класс объекта. Применявшийся ранее синоним
type
объявлен устаревшим.

s = "Hello"

n = 237

sc = s.class # String

nc = n.class # Fixnum

He думайте, будто методы

class
или
type
возвращают строку, представляющую имя класса. На самом деле возвращается экземпляр класса
Class
! При желании мы могли бы вызвать метод класса, определенный в этом типе, как если бы это был метод экземпляра класса
Class
(каковым он в действительности и является).

s2 = "some string"

var = s2.class # String

my_str = var.new("Hi...") # Новая строка.

Можно сравнить такую переменную с константным именем класса и выяснить, равны ли они; можно даже использовать переменную в роли суперкласса и определить на ее основе подкласс! Запутались? Просто помните, что в Ruby

Class
— это объект, a
Object
— это класс.

Иногда нужно сравнить объект с классом, чтобы понять, принадлежит ли данный объект указанному классу. Для этого служит метод

instance_of?
, например:

puts (5.instance_of? Fixnum) # true

puts ("XYZZY".instance_of? Fixnum) # false

puts ("PLUGH".instance_of? String) # true

А если нужно принять во внимание еще и отношение наследования? К вашим услугам метод

kind_of?
(похожий на
instance_of?
). У него есть синоним
is_a?
, что вполне естественно, ибо мы описываем классическое отношение «является».

n = 9876543210

flag1 = n.instance_of? Bignum # true

flag2 = n.kind_of? Bignum # true

flag3 = n.is_a? Bignum # true

flag3 = n.is_a? Integer # true

flag4 = n.is_a? Numeric # true

flag5 = n.is_a? Object # true

flag6 = n.is_a? String # false

flag7 = n.is_a? Array # false

Ясно, что метод

kind_of
или
is_a?
более общий, чем
instance_of?
. Например, всякая собака — млекопитающее, но не всякое млекопитающее — собака.

Для новичков в Ruby приготовлен один сюрприз. Любой модуль, подмешиваемый в класс, становится субъектом отношения «является» для экземпляров этого класса. Например, в класс

Array
подмешан модуль
Enumerable
; это означает, что всякий массив является перечисляемым объектом.

x = [1, 2, 3]

flag8 = x.kind_of? Enumerable # true

flag9 = x.is_a? Enumerable # true

Для сравнения двух классов можно пользоваться также операторами сравнения. Интуитивно очевидно, что оператор «меньше» обозначает наследование суперклассу.

flag1 = Integer < Numeric # true

flag2 = Integer < Object # true

flag3 = Object == Array # false

flag4 = IO >= File # true

flag5 = Float < Integer # nil

В любом классе обычно определен оператор «тройного равенства»

===
. Выражение
class === instance
истинно, если экземпляр
instance
принадлежит классу
class
. Этот оператор еще называют оператором ветвящегося равенства, потому что он неявно используется в предложении
case
. Дополнительную информацию о нем вы найдете в разделе 11.1.7.

Упомянем еще метод

respond_to
. Он используется, когда нам безразлично, какому классу принадлежит объект, но мы хотим знать, реализует ли он конкретный метод. Это рудиментарный вид получения информации о типе. (Вообще-то можно сказать, что это самая важная информация о типе.) Методу
respond_to
передается символ и необязательный флаг, который говорит, нужно ли включать в рассмотрение также и закрытые методы.

# Искать открытые методы.

if wumpus.respond_to?(:bite)

 puts "У него есть зубы!"

else

 puts "Давай-ка подразним его."

end

# Необязательный второй параметр позволяет

# просматривать и закрытые методы.

if woozle.respond_to?(:bite,true)

 puts "Вузлы кусаются!"

else

 puts "Ага, это не кусающийся вузл."

end

Иногда нужно знать, является ли данный класс непосредственным родителем объекта или класса. Ответ на этот вопрос дает метод

superclass
класса
Class
.

array_parent = Array.superclass # Object

fn_parent = 237.class.superclass # Integer

obj_parent = Object.superclass # nil

У любого класса, кроме

Object
, есть суперкласс.

11.1.7. Проверка объектов на равенство

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

Идеальный мир для Лекаря 18

Сапфир Олег
18. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 18

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Третий. Том 5

INDIGO
5. Отпуск
Фантастика:
космическая фантастика
фантастика: прочее
5.00
рейтинг книги
Третий. Том 5

Первый среди равных. Книга XIII

Бор Жорж
13. Первый среди Равных
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга XIII

Живое проклятье

Алмазов Игорь
3. Жизнь Лекаря с нуля
Фантастика:
попаданцы
альтернативная история
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Живое проклятье

Я все еще не царь. Книга XXVI

Дрейк Сириус
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я все еще не царь. Книга XXVI

Как я строил магическую империю 3

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

Назад в будущее

Поселягин Владимир Геннадьевич
5. Зург
Фантастика:
боевая фантастика
5.00
рейтинг книги
Назад в будущее

Кукловод

Майерс Александр
4. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кукловод

Моров. Том 7

Кощеев Владимир
6. Моров
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Моров. Том 7

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Мастер 9

Чащин Валерий
9. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 9