class BasicObject
BasicObject ist die Oberklasse aller Klassen in Ruby. Insbesondere ist BasicObject die Oberklasse der Klasse Object, die selbst die Standard-Oberklasse jeder Ruby-Klasse ist.
class Foo; end Foo.superclass # => Object Object.superclass # => BasicObject
BasicObject ist die einzige Klasse ohne Elternteil.
BasicObject.superclass # => nil
Die Klasse BasicObject kann verwendet werden, um eine Objekt-Hierarchie (z. B. die Klasse Delegator) zu erstellen, die unabhängig von Rubys Objekt-Hierarchie ist. Solche Objekte
-
haben keine Namensraum-„Verschmutzung“ durch die vielen Methoden, die in der Klasse
Objectund ihrem inkludierten ModulKernelbereitgestellt werden. -
haben keine Definitionen von gängigen Klassen, daher müssen Verweise auf solche gängigen Klassen vollständig qualifiziert sein (
::String, nichtString).
Eine Vielzahl von Strategien kann verwendet werden, um nützliche Teile der Standardbibliothek in Unterklassen von BasicObject bereitzustellen.
-
Die direkte Unterklasse könnte
Kernelincluden, was Methoden wieputs,exitusw. definieren würde. -
Ein benutzerdefiniertes Kernel-ähnliches Modul könnte erstellt und inkludiert werden.
-
Delegation kann über
method_missingerfolgen.class MyObjectSystem < BasicObject DELEGATE = [:puts, :p] def method_missing(name, *args, &block) return super unless DELEGATE.include? name ::Kernel.send(name, *args, &block) end def respond_to_missing?(name, include_private = false) DELEGATE.include?(name) end end
Was gibt es hier
Dies sind die Methoden, die für BasicObject definiert sind.
-
::new: Gibt eine neue BasicObject-Instanz zurück. -
!: Gibt die boolesche Negation vonselfzurück:trueoderfalse. -
!=: Gibt zurück, obselfund das gegebene Objekt *nicht* gleich sind. -
==: Gibt zurück, obselfund das gegebene Objekt äquivalent sind. -
__id__: Gibt die Ganzzahl-Objekt-ID fürselfzurück. -
__send__: Ruft die Methode auf, die durch das gegebene Symbol identifiziert wird. -
equal?: Gibt zurück, obselfund das gegebene Objekt dasselbe Objekt sind. -
instance_eval: Wertet den gegebenen String oder Block im Kontext vonselfaus. -
instance_exec: Führt den gegebenen Block im Kontext vonselfaus und übergibt dabei die gegebenen Argumente. -
method_missing: Wird aufgerufen, wennselfmit einer Methode aufgerufen wird, die es nicht definiert. -
singleton_method_added: Wird aufgerufen, wenn eine Singleton-Methode zuselfhinzugefügt wird. -
singleton_method_removed: Wird aufgerufen, wenn eine Singleton-Methode ausselfentfernt wird. -
singleton_method_undefined: Wird aufgerufen, wenn eine Singleton-Methode inselfundefiniert wird.
Öffentliche Klassenmethoden
Öffentliche Instanzmethoden
Source
VALUE
rb_obj_not(VALUE obj)
{
return RBOOL(!RTEST(obj));
}
Boolesche Negation.
Source
VALUE
rb_obj_not_equal(VALUE obj1, VALUE obj2)
{
VALUE result = rb_funcall(obj1, id_eq, 1, obj2);
return rb_obj_not(result);
}
Gibt true zurück, wenn zwei Objekte nicht gleich sind, andernfalls false.
Source
VALUE
rb_obj_equal(VALUE obj1, VALUE obj2)
{
return RBOOL(obj1 == obj2);
}
Gleichheit — Auf der Ebene von Object gibt == nur dann true zurück, wenn obj und other dasselbe Objekt sind. Typischerweise wird diese Methode in abgeleiteten Klassen überschrieben, um eine klassenspezifische Bedeutung zu bieten.
Im Gegensatz zu == sollte die Methode equal? niemals von Unterklassen überschrieben werden, da sie zur Bestimmung der Objektidentität verwendet wird (d. h. a.equal?(b), wenn und nur wenn a dasselbe Objekt wie b ist).
obj = "a" other = obj.dup obj == other #=> true obj.equal? other #=> false obj.equal? obj #=> true
Die Methode eql? gibt true zurück, wenn obj und other auf denselben Hash-Schlüssel verweisen. Dies wird von Hash verwendet, um Elemente auf Gleichheit zu prüfen. Für jedes Paar von Objekten, für das eql? true zurückgibt, muss der Hash-Wert beider Objekte gleich sein. Jede Unterklasse, die eql? überschreibt, sollte daher auch hash entsprechend überschreiben.
Für Objekte der Klasse Object ist eql? gleichbedeutend mit ==. Unterklassen setzen diese Tradition normalerweise fort, indem sie eql? mit ihrer überschriebenen Methode == verknüpfen, aber es gibt Ausnahmen. Numeric-Typen führen beispielsweise Typkonvertierungen über == durch, aber nicht über eql?, daher
1 == 1.0 #=> true 1.eql? 1.0 #=> false
Source
VALUE
rb_obj_id(VALUE obj)
{
/* If obj is an immediate, the object ID is obj directly converted to a Numeric.
* Otherwise, the object ID is a Numeric that is a non-zero multiple of
* (RUBY_IMMEDIATE_MASK + 1) which guarantees that it does not collide with
* any immediates. */
return rb_find_object_id(rb_gc_get_objspace(), obj, object_id);
}
Gibt eine Ganzzahl-ID für obj zurück.
Dieselbe Zahl wird bei allen Aufrufen von object_id für ein bestimmtes Objekt zurückgegeben, und keine zwei aktiven Objekte teilen sich eine ID.
Hinweis: Einige Objekte von integrierten Klassen werden für die Optimierung wiederverwendet. Dies ist der Fall bei sofortigen Werten und eingefrorenen String-Literalen.
BasicObject implementiert __id__, Kernel implementiert object_id.
Sofortige Werte werden nicht per Referenz, sondern per Wert übergeben: nil, true, false, Fixnums, Symbole und einige Floats.
Object.new.object_id == Object.new.object_id # => false (21 * 2).object_id == (21 * 2).object_id # => true "hello".object_id == "hello".object_id # => false "hi".freeze.object_id == "hi".freeze.object_id # => true
Source
VALUE
rb_f_send(int argc, VALUE *argv, VALUE recv)
{
return send_internal_kw(argc, argv, recv, CALL_FCALL);
}
Ruft die durch symbol identifizierte Methode auf und übergibt ihr alle angegebenen Argumente. Wenn die Methode durch einen String identifiziert wird, wird der String in ein Symbol konvertiert.
BasicObject implementiert __send__, Kernel implementiert send. __send__ ist sicherer als send, wenn obj denselben Methodennamen hat wie z. B. Socket. Siehe auch public_send.
class Klass def hello(*args) "Hello " + args.join(' ') end end k = Klass.new k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
Gleichheit — Auf der Ebene von Object gibt == nur dann true zurück, wenn obj und other dasselbe Objekt sind. Typischerweise wird diese Methode in abgeleiteten Klassen überschrieben, um eine klassenspezifische Bedeutung zu bieten.
Im Gegensatz zu == sollte die Methode equal? niemals von Unterklassen überschrieben werden, da sie zur Bestimmung der Objektidentität verwendet wird (d. h. a.equal?(b), wenn und nur wenn a dasselbe Objekt wie b ist).
obj = "a" other = obj.dup obj == other #=> true obj.equal? other #=> false obj.equal? obj #=> true
Die Methode eql? gibt true zurück, wenn obj und other auf denselben Hash-Schlüssel verweisen. Dies wird von Hash verwendet, um Elemente auf Gleichheit zu prüfen. Für jedes Paar von Objekten, für das eql? true zurückgibt, muss der Hash-Wert beider Objekte gleich sein. Jede Unterklasse, die eql? überschreibt, sollte daher auch hash entsprechend überschreiben.
Für Objekte der Klasse Object ist eql? gleichbedeutend mit ==. Unterklassen setzen diese Tradition normalerweise fort, indem sie eql? mit ihrer überschriebenen Methode == verknüpfen, aber es gibt Ausnahmen. Numeric-Typen führen beispielsweise Typkonvertierungen über == durch, aber nicht über eql?, daher
1 == 1.0 #=> true 1.eql? 1.0 #=> false
Source
static VALUE
rb_obj_instance_eval_internal(int argc, const VALUE *argv, VALUE self)
{
return specific_eval(argc, argv, self, TRUE, RB_PASS_CALLED_KEYWORDS);
}
Wertete einen String, der Ruby-Quellcode enthält, oder den gegebenen Block im Kontext des Empfängers (obj) aus. Um den Kontext festzulegen, wird die Variable self während der Ausführung des Codes auf obj gesetzt, wodurch der Code Zugriff auf die Instanzvariablen und privaten Methoden von obj erhält.
Wenn instance_eval einen Block erhält, wird obj auch als einziges Argument des Blocks übergeben.
Wenn instance_eval einen String erhält, liefern die optionalen zweiten und dritten Parameter einen Dateinamen und eine Startzeilennummer, die bei der Meldung von Kompilierungsfehlern verwendet werden.
class KlassWithSecret def initialize @secret = 99 end private def the_secret "Ssssh! The secret is #{@secret}." end end k = KlassWithSecret.new k.instance_eval { @secret } #=> 99 k.instance_eval { the_secret } #=> "Ssssh! The secret is 99." k.instance_eval {|obj| obj == self } #=> true
Source
static VALUE
rb_obj_instance_exec_internal(int argc, const VALUE *argv, VALUE self)
{
return yield_under(self, TRUE, argc, argv, RB_PASS_CALLED_KEYWORDS);
}
Führt den gegebenen Block im Kontext des Empfängers (obj) aus. Um den Kontext festzulegen, wird die Variable self während der Ausführung des Codes auf obj gesetzt, wodurch der Code Zugriff auf die Instanzvariablen von obj erhält. Argumente werden als Blockparameter übergeben.
class KlassWithSecret def initialize @secret = 99 end end k = KlassWithSecret.new k.instance_exec(5) {|x| @secret+x } #=> 104
Private Instanzmethoden
Source
static VALUE
rb_method_missing(int argc, const VALUE *argv, VALUE obj)
{
rb_execution_context_t *ec = GET_EC();
raise_method_missing(ec, argc, argv, obj, ec->method_missing_reason);
UNREACHABLE_RETURN(Qnil);
}
Wird von Ruby aufgerufen, wenn obj eine Nachricht erhält, die es nicht verarbeiten kann. symbol ist das Symbol für die aufgerufene Methode, und args sind alle an sie übergebenen Argumente. Standardmäßig löst der Interpreter einen Fehler aus, wenn diese Methode aufgerufen wird. Es ist jedoch möglich, die Methode zu überschreiben, um ein dynamischeres Verhalten bereitzustellen. Wenn entschieden wird, dass eine bestimmte Methode nicht behandelt werden soll, sollte super aufgerufen werden, damit Vorfahren die fehlende Methode abfangen können. Das folgende Beispiel erstellt eine Klasse Roman, die auf Methoden mit Namen reagiert, die aus römischen Ziffern bestehen, und die entsprechenden ganzzahligen Werte zurückgibt.
class Roman def roman_to_int(str) # ... end def method_missing(symbol, *args) str = symbol.id2name begin roman_to_int(str) rescue super(symbol, *args) end end end r = Roman.new r.iv #=> 4 r.xxiii #=> 23 r.mm #=> 2000 r.foo #=> NoMethodError
Source
#define rb_obj_singleton_method_added rb_obj_dummy1
Wird als Rückruf aufgerufen, wenn eine Singleton-Methode zum Empfänger hinzugefügt wird.
module Chatty def Chatty.singleton_method_added(id) puts "Adding #{id.id2name}" end def self.one() end def two() end def Chatty.three() end end
ergibt
Adding singleton_method_added Adding one Adding three
Source
#define rb_obj_singleton_method_removed rb_obj_dummy1
Wird als Rückruf aufgerufen, wenn eine Singleton-Methode aus dem Empfänger entfernt wird.
module Chatty def Chatty.singleton_method_removed(id) puts "Removing #{id.id2name}" end def self.one() end def two() end def Chatty.three() end class << self remove_method :three remove_method :one end end
ergibt
Removing three Removing one
Source
#define rb_obj_singleton_method_undefined rb_obj_dummy1
Wird als Rückruf aufgerufen, wenn eine Singleton-Methode im Empfänger undefiniert wird.
module Chatty def Chatty.singleton_method_undefined(id) puts "Undefining #{id.id2name}" end def Chatty.one() end class << self undef_method(:one) end end
ergibt
Undefining one