Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
end endend31.prime? # true237.prime? # false1500450271.prime? # true5.15. Явные и неявные преобразования чисел
Программисты, только начинающие изучать Ruby, часто удивляются, зачем нужны два метода
to_ito_intto_fto_fltЧто это означает? Во-первых, в большинстве классов определены явные конверторы, но нет неявных. Насколько мне известно, методы
to_intto_fltВо-вторых, в своих собственных классах вы, скорее всего, будете определять неявные конверторы, но не станете вызывать их вручную (если только не заняты написанием «клиентского» кода или библиотеки, которая пытается не конфликтовать с внешним миром).
Следующий пример, конечно, надуманный. В нем определен класс
MyClassto_ito_intclass MyClass def to_i 3 end def to_int 5 endendЖелая явно преобразовать объект класса
MyClassto_im = MyClass.new x = m.to_i # 3Но при передаче объекта
MyClassto_intArray.newMyClassm = MyClass.newa = Array.new(m) # [nil,nil,nil,nil,nil]Как видите, метод
newto_intДополнительную информацию о поведении в другом контексте (строковом) вы найдете в разделе 2.16. См. также раздел 5.16.
5.16. Приведение числовых значений
Приведение можно считать еще одним видом неявного преобразования. Если некоторому методу (например,
+class MyNumberSystem def +(other) if other.kind_of?(MyNumberSystem) result = some_calculation_between_self_and_other MyNumberSystem.new(result) else n1, n2 = other.coerce(self) n1 + n2 end endendМетод
coerceВ данном примере мы полагаемся на то, что приведение выполнит тип аргумента. Но если мы хотим быть законопослушными гражданами, то должны реализовать приведение в своем классе, сделав его пригодным для работы с другими типами чисел. Для этого нужно знать, с какими типами мы в состоянии работать непосредственно, и при необходимости выполнять приведение к одному из этих типов. Если мы не можем сделать это самостоятельно, то должны обратиться за помощью к родительскому классу.
def coerce(other) if other.kind_of?(Float) return other, self.to_f elsif other.kind_of?(Integer) return other, self.to_i else super endendРазумеется, это будет работать только, если наш объект реализует методы
to_ito_fМетод
coerceclass String def coerce(n) if self['.'] [n, Float(self)] else [n, Integer(self)] end endendx = 1 + "23" # 24y = 23 * "1.23" # 28.29Мы не настаиваем на таком решении. Но рекомендуем реализовывать
coerce5.17. Поразрядные операции над числами
Иногда требуется работать с двоичным представлением объекта
FixnumRuby обладает всеми средствами для таких операций. Для удобства числовые константы можно записывать в двоичном, восьмеричном или шестнадцатеричном виде. Поразрядным операциям И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ и НЕ соответствуют операторы
&|^~x = 0377 # Восьмеричное (десятичное 255)
