J'ai rencontré une question étrange à propos de l'initialisation du message d'initialisation de BigDecimal.question à propos de la méthode d'initialisation surchargée
class Test1 < String
def initialize(a, b)
puts a
puts b
end
end
require 'bigdecimal'
class Test2 < BigDecimal
def initialize(a, b)
puts a
puts b
end
end
>> Test1.new('a', 'b')
a
b
>> Test2.new('a', 'b')
TypeError: wrong argument type String (expected Fixnum)
from (irb):17:in `new'
from (irb):17
Pourquoi je ne peux ignorer le message initialize de chaîne, mais pas de BigDecimal?
Je veux éclairer cela un peu plus. Puisque ruby n'autorise pas la surcharge, elle n'autorise qu'une seule méthode 'initialize '. La dernière méthode définie sera la seule valide. En outre, il ne permettra qu'une seule méthode 'nouvelle '. Normalement, la nouvelle méthode (définie sur Object) appelle la méthode initialize, mais comme mentionné ici: le 'new 'BigDecimal est différent :) Vous devez donc redéfinir' self.new' bien que ce ne soit pas la méthode préférée. N'oubliez pas d'appeler 'super' avec les paramètres corrects, sinon vous n'aurez pas de BigDecimal. Normalement, vous n'auriez pas à définir de nouveau, – nathanvda