En Ruby, ¿cuál es la relación entre 'new
' y 'initialize
'?
new
normalmente llamadas initialize
. La implementación predeterminada de new
es algo así como:
class Class
def new(*args, &block)
obj = allocate
obj.initialize(*args, &block)
# actually, this is obj.send(:initialize, …) because initialize is private
obj
end
end
Pero se puede, por supuesto, anularlo para hacer cualquier cosa que desee.
Cómo devolver nil durante la inicialización?
Lo que quiero es:
obj = Foo.new(0) # => nil or false
esto no funciona:
class Foo
def initialize(val)
return nil if val == 0
end
end
que conozco en C/C++/Java/C#, nosotros no podemos devolver un valor en un constructor.
Pero me pregunto si es posible en Ruby.
No hay tal cosa como un constructor en Ruby. Los constructores son innecesarios en un lenguaje bien diseñado. En Ruby, solo hay métodos y por supuesto, los métodos pueden devolver valores.
El problema que está viendo es simplemente que desea cambiar el valor de retorno de un método, pero está anulando un método diferente. Por supuesto que no funciona. Si desea cambiar el valor de retorno del método bar
, debe anular bar
, no algún otro método.
Si desea cambiar el comportamiento de Foo::new
, entonces debería cambiar Foo::new
:
class Foo
def self.new(val)
return nil if val.zero?
super
end
end
Nótese, sin embargo, que este es un muy mala idea, ya que viola el contrato de new
, que es devolver una instancia completamente inicializada y completamente funcional de la clase.
Si se trata de un control de cordura, una cosa más amigable sería plantear una excepción explicando * por qué * no continúa la inicialización. Devolver nil solo va a crear una confusión (seria). Nadie esperaría que un objeto recién instanciado sea nulo;) – d11wtq
No hay constructores en 'C'. – YoTengoUnLCD
La notable excepción a la declaración de @ d11wtq sería 'NilClass.new()'. –