Можно создать дубликат:
In Ruby is there a way to overload the initialize constructor?Как перегрузить contructor в Ruby?
BigDecimal
не принимает поплавок как в первоначальной стоимости, так что я пишу конструктор для его обработки. Кажется, что он игнорирует метод initialize и вызывает конструктор по умолчанию.
Он бросает TypeError can't convert Float into String (TypeError)
format
Метод действительно работает.
файл BigDecimal.rb:
require 'bigdecimal'
class BigDecimal
def initialize
if self.class == Float
super self.to_s
end
end
def format
sprintf("%.2f", self)
end
end
Затем в файле test.rb:
require 'BigDecimal' # => true
bd = BigDecimal.new('54.4477') # works
puts bd.format # 54.44
bd2 = BigDecimal.new(34.343) # TypeError: can't convert Float into String (TypeError)
Руби 1.9.2
http://stackoverflow.com/a/3958786/643500 –
перенастройка конструктор с версией, которая не принимает никаких аргументов. Уверен, что вы тестируете код? Если да, это означает, что инициализация никогда не называется (в любом случае это багги). Вместо этого попробуйте подклассифицировать BigDecimal. Подкласс предпочтительнее по сравнению с monkeypatching большую часть времени. –