Вход/Регистрация
Программирование на языке 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)

  • Читать дальше
  • 1
  • ...
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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