rails modulos mapas manejo errores ruby exception constructor

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.