Nouveau à Ruby, et j'essaie de comprendre ce que l'IDIOM à utiliser pour limiter des valeurs entières au constructeur d'une classe. P>
de ce que j'ai fait jusqu'à présent, si j'échappe une exception dans Donc, ma question est, de quel mécanisme puis-je limiter la plage de valeurs qu'un objet est instancié? P> initialisée () code>, l'objet est toujours créé mais sera dans un état non valide (par exemple, certains
nil code> 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 () p>. P>.
4 Réponses :
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). P> blockQuote>
xxx pré> p>
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éé i> 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 code> il obtiendra GC'ed.
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
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
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!
Ouais, je me suis confondu sur ce problème. J'étais
sauvetage code> à l'exception du constructeur, il s'agit donc de raisonner que l'instance serait créée.