Digamos que creo una nueva clase que hereda de Symbol. Los símbolos son únicos y está muy claro que la clase Símbolo no tiene Constructor. Pero, ¿qué mecanismo impide la creación de un constructor en la clase secundaria? ¿Existe alguna bandera que haga únicos a todos los niños?
class Syb < Symbol def initialize end end p Syb.respond_to? :new falseEn primer lugar, también creo que no es una buena idea extender las clases básicas de Ruby, las referencias
En este caso en particular
"Para mayor eficiencia, muchos métodos de clase central están codificados en C en lugar de Ruby. Y en algunos casos, como este operador de suma de Array, se implementan de tal manera que la clase del valor de retorno está codificada".
Si observa el método de inicialización en la clase Ruby Symbol (realmente tiene):
[36] pry(main)> require 'pry-doc' => true [72] pry(main)> cd Symbol [73] pry(Symbol):1> $ initialize From: object.c (C Method): Owner: BasicObject Visibility: private Signature: initialize() Number of lines: 5 static VALUE rb_obj_dummy0(VALUE _) { return rb_obj_dummy(); }Entonces podemos ver que este método ya existe y está implementado en c, pero existe una limitación sobre la anulación de los métodos de las clases principales de ruby, explicado en esta respuesta
Y también creo que es muy importante investigar con ruby, pry pry-doc y pry-gem
Como dijo Sergio, mi error fue la confusión de constructor e inicializador. En realidad, es posible escribir un nuevo constructor para la clase Símbolo.
irb(main):001:1* class Symbol irb(main):002:2* def Symbol.new x irb(main):003:2* x.to_sym irb(main):004:1* end irb(main):005:0> end => :new irb(main):008:0> a = Symbol.new "xyz" => :xyz irb(main):009:0> a => :xyz Sí, me doy cuenta de que aquí el símbolo en realidad se crea mediante el método .to_sym . Entonces, new no es realmente un constructor, sino más bien un envoltorio para el constructor real.
Digamos que creo una nueva clase que hereda de Symbol. Los símbolos son únicos y está muy claro que la clase Símbolo no tiene Constructor.
Esta declaración es trivialmente cierta, ya que Ruby no tiene constructores.
Pero, ¿qué mecanismo impide la creación de un constructor en la clase secundaria?
El hecho de que Ruby no tenga constructores impide la creación de un constructor.
¿Existe alguna bandera que haga únicos a todos los niños?
No.