Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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
Упомянем еще метод
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. Проверка объектов на равенство
Все животные равны, но некоторые равнее других.
При написании своих классов желательно, чтобы семантика типичных операций была такой же, как у встроенных в Ruby классов. Например, если объекты класса можно упорядочивать, то имеет смысл реализовать метод
<=>
Comparable
Однако картина перестает быть такой однозначной, когда дело доходит до проверки объектов на равенство. В Ruby объекты реализуют пять разных методов для этой операции. И в ваших классах придется реализовать хотя бы некоторые из них, поэтому рассмотрим этот вопрос подробнее.
Самым главным является метод
equal?
Object
true
Самым распространенным способом проверки на равенство является старый добрый оператор
==
Следующим в шкале абстракции стоит метод
eql?
Object
eql?
Kernel
Object
==
==
eql?
flag1 = (1 == 1.0) # true
flag2 = (1.eql?(1.0)) # false
Метод
eql?
eql?
hash
Любой объект реализует еще два метода сравнения. Метод
===
case
selector===target
case
case an_object
when String