modulos - rescue ruby
Constructores y excepciones Ruby (4)
Huh, tienes toda la razón de que el objeto aún vive, incluso si initialize
genera una excepción. Sin embargo, será bastante difícil para cualquier persona aferrarse a una referencia a menos que se escape de initialize
como lo hace el siguiente código que acabo de escribir:
>> 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!
Nuevo para Ruby, y estoy tratando de averiguar qué idioma usar para restringir algunos valores enteros al constructor de una clase.
Por lo que he hecho hasta ahora, si presento una excepción en initialize()
, el objeto aún se crea pero estará en un estado inválido (por ejemplo, algunos valores nil
en variables de instancia). No puedo ver cómo se supone que debo restringir los valores sin entrar en lo que parece pasos innecesariamente grandes como restringir el acceso a new()
.
Entonces mi pregunta es, ¿por qué mecanismo puedo restringir el rango de valores con el que se crea una instancia de un objeto?
No estoy seguro acerca de esta declaración:
Por lo que he hecho hasta ahora, si presento una excepción en initialize (), el objeto aún se crea pero estará en un estado inválido (por ejemplo, algunos valores nulos en variables de instancia).
class Foo
def initialize(num)
raise ArgumentError.new("Not valid number") if num > 1000
@num = num
end
end
f = Foo.new(4000) #=> n `initialize'': not valid (RuntimeError)
Si estoy leyendo tu pregunta correctamente, lo que quieres es algo como esto:
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
No se preocupe, SerialNumber.new crea una instancia antes de que se llame al método de initialize
; se limpiará si se produce un error.
Usar el módulo validable parece ser una buena opción en el contexto.
Aquí hay un ejemplo de cómo usarlo:
class Person
include Validatable
validates_numericality_of :age
end
Para hacer un número solo en un rango particular, sería:
class Person
include Validatable
validates_numericality_of :age
validates_true_for :age, :logic => lambda { (0..100).include?(age) }
end
Esto, por supuesto, validará que la edad esté dentro del rango de 0 y 100.