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

5.16. Приведение числовых значений

5.16. Приведение числовых значений

Приведение можно считать еще одним видом неявного преобразования. Если некоторому методу (например, +) передается аргумент, которого он не понимает, он пытается привести объект, от имени которого вызван, и аргумент к совместимым типам, а затем сложить их. Принцип использования метода coerce в вашем собственном классе понятен из следующего примера:

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
 end
end

Метод 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
 end
end

Разумеется, это будет работать только, если наш объект реализует методы to_i и to_f.

Метод coerce можно применить для реализации автоматического преобразования строк в числа, как в языке Perl:

class String
 def coerce(n)
  if self['.']
   [n, Float(self)]
  else
   [n, Integer(self)]
  end
 end
end
x = 1 + "23"    # 24
y = 23 * "1.23" # 28.29

Мы не настаиваем на таком решении. Но рекомендуем реализовывать coerce при создании любого класса для работы с числовыми данными.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.570. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз