Переопределить BigDecimal to_s по умолчанию в Ruby - PullRequest
2 голосов
/ 25 февраля 2010

Когда я получаю данные из таблицы базы данных, заполняется массив. Некоторые поля определены как десятичные и денежные поля, а в массиве они представлены как BigDecimal.

Я использую эти значения массива для заполнения файла CSV, но проблема в том, что все значения BigDecimal по умолчанию представлены в научном формате (что является поведением по умолчанию метода BigDecimal to_s). Я могу показать значения с помощью to_s ('F'), но как я могу переопределить значение по умолчанию?

Ответы [ 3 ]

2 голосов
/ 26 февраля 2010

Это основано на ответе @ Фаррела, но без загрязнения пространства имен метода бесполезным old_xyz методом. Кроме того, почему бы не использовать параметры по умолчанию напрямую?

class BigDecimal
  old_to_s = instance_method :to_s

  define_method :to_s do |param='F'|
    old_to_s.bind(self).(param)
  end
end

В Ruby 1.8 это выглядит немного ужаснее:

class BigDecimal
  old_to_s = instance_method :to_s

  define_method :to_s do |param|
    old_to_s.bind(self).call(param || 'F')
  end
end

Или, если вам не нравится предупреждение, которое вы получаете с кодом выше:

class BigDecimal
  old_to_s = instance_method :to_s

  define_method :to_s do |*param|
    old_to_s.bind(self).call(param.first || 'F')
  end
end
1 голос
/ 25 февраля 2010
class BigDecimal
  alias old_to_s to_s

  def to_s( param = nil )
      self.old_to_s( param || 'F' )
   end
end
0 голосов
/ 25 февраля 2010

Ruby делает это легко. Вот:

class BigDecimal
  def to_s
    return "Whatever weird format you want"
  end
end

# Now BigDecimal#to_s will do something new, for all BigDecimal objects everywhere.

Эту технику называют мартышкой. Как вы можете догадаться из названия, это то, что вы должны использовать осторожно. Это использование кажется мне разумным.

...