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

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

Жанры

Программирование на языке 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. Проверка объектов на равенство

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

Санкт-Петербург. Автобиография

Королев Кирилл Михайлович
Научно-образовательная:
история
5.00
рейтинг книги
Санкт-Петербург. Автобиография

Клиент

Гришэм Джон
Детективы:
триллеры
8.40
рейтинг книги
Клиент

Неучтенный элемент. Том 7

NikL
7. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 7

Свободный среди звезд: пилот

Викулов Петр Иванович
Вселенная EVE Online
Фантастика:
космическая фантастика
7.83
рейтинг книги
Свободный среди звезд: пилот

Старплекс. Конец эры (сборник)

Сойер Роберт Джеймс
Шедевры фантастики
Фантастика:
научная фантастика
6.25
рейтинг книги
Старплекс. Конец эры (сборник)

Перехитрить богов. Дилогия

Высоцкий Михаил Владимирович
29. В одном томе
Фантастика:
научная фантастика
6.50
рейтинг книги
Перехитрить богов. Дилогия

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

Володин Григорий Григорьевич
26. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.25
рейтинг книги
Газлайтер. Том 26

Северянин. Трилогия

Лей Влад
Северянин
Фантастика:
фэнтези
5.75
рейтинг книги
Северянин. Трилогия

Город Бездны

Рейнольдс Аластер
1. Космический апокалипсис
Фантастика:
научная фантастика
космическая фантастика
6.71
рейтинг книги
Город Бездны

Право на жизнь

Арно Сергей Игоревич
Фантастика:
ужасы и мистика
7.17
рейтинг книги
Право на жизнь

Старая школа рул

Ромов Дмитрий
1. Второгодка
Фантастика:
альтернативная история
6.00
рейтинг книги
Старая школа рул

Война с Востока. Книга об афганском походе

Проханов Александр Андреевич
Проза:
военная проза
7.00
рейтинг книги
Война с Востока. Книга об афганском походе

Основы общей психологии

Рубинштейн Сергей Леонидович
Мастера психологии
Научно-образовательная:
психология
5.00
рейтинг книги
Основы общей психологии

Американская трагедия

Драйзер Теодор
150. Библиотека всемирной литературы
Проза:
классическая проза
8.00
рейтинг книги
Американская трагедия