10
votes

Constructeurs de rubis et exceptions

Nouveau à Ruby, et j'essaie de comprendre ce que l'IDIOM à utiliser pour limiter des valeurs entières au constructeur d'une classe.

de ce que j'ai fait jusqu'à présent, si j'échappe une exception dans initialisée () , l'objet est toujours créé mais sera dans un état non valide (par exemple, certains nil valeurs par exemple variables). Je ne peux pas savoir comment je suis censé restreindre les valeurs sans entrer dans ce qui a l'air inutilement gros étapes, comme restreindre l'accès au nouveau (code> nouveau () . .

Donc, ma question est, de quel mécanisme puis-je limiter la plage de valeurs qu'un objet est instancié?


1 commentaires

Ouais, je me suis confondu sur ce problème. J'étais sauvetage à l'exception du constructeur, il s'agit donc de raisonner que l'instance serait créée.


4 Réponses :


4
votes

Je ne suis pas sûr de cette déclaration:

de ce que j'ai fait jusqu'à présent, si j'applève une exception dans l'initialisation (), la l'objet est toujours créé mais sera dans un état non valide (par exemple, certains Nil valeurs par exemple variables). xxx


2 commentaires

Hmm, je vais devoir examiner mon code et voir si peut-être que je me trompe. Merci d'avoir répondu.


En fait, l'objet est créé créé, c'est juste que .New ne retournera pas la référence, donc à moins que l'objet se lie à elle-même pendant initialize il obtiendra GC'ed.



2
votes

Si je lis votre question correctement, ce que vous voulez, c'est quelque chose comme ceci:

class SerialNumber
  VALID_SERIAL_NUMBERS = (0..10,000,000,000)
  def initialize(n)
    raise ArgumentError.new("Serial numbers must be positive integers less than 10 Billion") unless VALID_SERIAL_NUMBERS.include?(n)
    @n = n
  end
end


0 commentaires

0
votes

Utilisation de Module validable semble être un très bon ajustement dans le contexte.

Voici un exemple de comment l'utiliser: P>

  class Person
    include Validatable
    validates_numericality_of :age
    validates_true_for :age, :logic => lambda { (0..100).include?(age) }
  end


0 commentaires

14
votes

hein, vous êtes tout à fait correct que l'objet vit toujours même si initialiser code> augmente une exception. Cependant, il sera assez difficile pour quiconque de se reportera à une référence à moins que vous fulgurez auto code> hors Initialiser code> comme le code suivant, je viens d'écrire fait:

>> class X
>>   def initialize
>>     $me = self
>>     raise
>>   end
>>   def stillHere!
>>     puts "It lives!"
>>   end
>> end
=> nil
>> t = X.new
RuntimeError: 
    from (irb):14:in `initialize'
    from (irb):20:in `new'
    from (irb):20
>> t
=> nil
>> $me
=> #<X:0xb7ab0e70>
>> $me.stillHere!
It lives!


0 commentaires