Sehr interessante Frage! Ich habe es recherchiert und einige interessante Dinge über Ruby gefunden, obwohl ich nicht die genaue Antwort gefunden habe, nach der Sie suchen.
initialize
ist eine private Instanzmethode, die für die meisten Objekte neu definiert werden soll. Es kommt von BasicObject
, der Ruby-Klasse, von der alle Objekte und Klassen erben.
Jede neue Klasse, die Sie in Ruby schaffen eine private Instanzmethode initialize
genannt haben:
q = Q.new
q.method(:initialize)
=> #<Method: Q(BasicObject)#initialize>
Und die Methode selbst ist nicht definiert in:
class Q ; end
Q.private_instance_methods.include?(:initialize)
=> true
Das Instanzmethode von BasicObject#initialize
vererbt wird Ruby, es kommt von der C-Quelle der Sprache:
q.method(:initialize).source_location
=> nil
Diese
ist, was die looks like in dem Ruby-Quellcode (object.c
-Datei):
rb_define_private_method(rb_cBasicObject, "initialize", rb_obj_dummy, 0);
rb_obj_dummy
ist im Grunde ein no-op function. Das ergibt Sinn, weil Sie erwarten, dass Sie initialize
mit Ihrem eigenen Implementierungscode in Ihrer Klasse überschreiben.
Alles, was gesagt wurde, war Ihre ursprüngliche Frage darüber, warum initialize nicht zu einer öffentlichen Methode wird, wenn Sie es im öffentlichen Raum in Ihrer Klassendefinition definieren. Ich weiß es nicht. Normalerweise, dass es für jede andere Methode, wenn Sie tun eine öffentliche Methode werden wird:
class Q
private
def my_private_method() "private" end
end
Q.new.my_private_method
NoMethodError: private method `my_private_method' called for #<Q:0x007fc5ea39eab0>
class Q
def my_private_method() "now i'm a public method" end
end
Q.new.my_private_method
=> "now i'm a public method"
Also ich denke, irgendwo anders tief im Quellcode eine Methode namens „Initialize“ definiert, ist anders als andere Methoden behandelt. Ich konnte es nicht finden, aber vielleicht kann es jemand anderes.
Sicherlich funktioniert OOP so? – AJFarmar
Was gefragt wird, ist warum die 'initialize' Methode speziell ist. Es wurde nicht als privat deklariert. – tadman
Yup, genau was Tadman gesagt hat! – conz