In Ruby, qual è la relazione tra "new
" e "initialize
"?
new
in genere chiama initialize
. L'implementazione predefinita di new
è qualcosa di simile:
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
Ma si può, ovviamente, ignorare per fare tutto quello che vuoi.
Come restituire nil durante l'inizializzazione?
Quello che voglio è:
obj = Foo.new(0) # => nil or false
Questo non funziona:
class Foo
def initialize(val)
return nil if val == 0
end
end
So in C/C++/Java/C#, non possiamo restituire un valore in un costruttore.
Ma mi chiedo se sia possibile in Ruby.
Non c'è cosa come un costruttore di in Ruby. I costruttori non sono necessari in un linguaggio ben progettato. In Ruby, ci sono solo metodi e ovviamente i metodi possono restituire valori.
Il problema che si sta vedendo è semplicemente che si desidera modificare il valore di ritorno di un metodo, ma si sta sovrascrivendo un metodo diverso. Ovviamente che non funziona. Se si desidera modificare il valore di ritorno del metodo bar
, è necessario eseguire l'override di bar
, non un altro metodo.
Se si desidera modificare il comportamento di Foo::new
, allora si dovrebbe cambiare Foo::new
:
class Foo
def self.new(val)
return nil if val.zero?
super
end
end
Si noti, tuttavia, che questo è un pessima idea, in quanto viola il contratto di new
, che è quello di restituire un'istanza completamente inizializzata e pienamente funzionante della classe.
Se si tratta di un controllo di integrità, una cosa più piacevole da fare sarebbe sollevare un'eccezione che spiega * perché * non si sta continuando l'inizializzazione. Restituire zero significa solo creare (serio) confusione. Nessuno si aspetterebbe mai che un oggetto appena istanziato sia zero;) – d11wtq
Non ci sono costruttori in 'C'. – YoTengoUnLCD
L'eccezione notevole alla dichiarazione di @ d11wtq sarebbe 'NilClass.new()'. –