class Object
Object ist die Standard-Wurzel aller Ruby-Objekte. Object erbt von BasicObject, was die Erstellung alternativer Objekt-Hierarchien ermöglicht. Methoden auf Object sind für alle Klassen verfügbar, es sei denn, sie werden explizit überschrieben.
Object mischt das Kernel-Modul ein, wodurch die integrierten Kernel-Funktionen global zugänglich gemacht werden. Obwohl die Instanzmethoden von Object vom Kernel-Modul definiert werden, haben wir uns entschieden, sie hier zur Verdeutlichung zu dokumentieren.
Beim Referenzieren von Konstanten in Klassen, die von Object erben, müssen Sie nicht den vollständigen Namespace verwenden. Wenn Sie beispielsweise File innerhalb von IhreKlasse referenzieren, wird die File-Klasse auf oberster Ebene gefunden.
In den Beschreibungen der Methoden von Object bezieht sich der Parameter symbol auf ein Symbol, das entweder ein Anführungszeichen-String oder ein Symbol ist (wie z.B. :name).
Was gibt es hier
Zuerst, was anderswo ist. Klasse Object
-
Erbt von class BasicObject.
-
Enthält module Kernel.
Hier stellt die Klasse Object Methoden für bereit
Abfragen
-
!~: Gibttruezurück, wennselfnicht mit dem gegebenen Objekt übereinstimmt, andernfallsfalse. -
<=>: Gibt 0 zurück, wennselfund das gegebene Objektobjectdasselbe Objekt sind oder wennself == object; andernfalls gibtnilzurück. -
===: Implementiert Case-Gleichheit, effektiv dasselbe wie der Aufruf von==. -
eql?: Implementiert Hash-Gleichheit, effektiv dasselbe wie der Aufruf von==. -
kind_of?(alias füris_a?): Gibt zurück, ob das gegebene Argument ein Vorfahre der Singleton-Klasse vonselfist. -
instance_of?: Gibt zurück, obselfeine Instanz der gegebenen Klasse ist. -
instance_variable_defined?: Gibt zurück, ob die gegebene Instanzvariable inselfdefiniert ist. -
method: Gibt dasMethod-Objekt für die gegebene Methode inselfzurück. -
methods: Gibt ein Array von Symbolnamen öffentlicher und geschützter Methoden inselfzurück. -
nil?: Gibtfalsezurück. (Nurnilantwortettrueauf die Methodenil?.) -
object_id: Gibt eine ganze Zahl zurück, dieselfentspricht und für den aktuellen Prozess eindeutig ist -
private_methods: Gibt ein Array von Symbolnamen der privaten Methoden inselfzurück. -
protected_methods: Gibt ein Array von Symbolnamen der geschützten Methoden inselfzurück. -
public_method: Gibt dasMethod-Objekt für die gegebene öffentliche Methode inselfzurück. -
public_methods: Gibt ein Array von Symbolnamen der öffentlichen Methoden inselfzurück. -
respond_to?: Gibt zurück, obselfauf die gegebene Methode reagiert. -
singleton_class: Gibt die Singleton-Klasse vonselfzurück. -
singleton_method: Gibt dasMethod-Objekt für die gegebene Singleton-Methode inselfzurück. -
singleton_methods: Gibt ein Array von Symbolnamen der Singleton-Methoden inselfzurück. -
define_singleton_method: Definiert eine Singleton-Methode inselffür den gegebenen Symbol-Methodennamen und Block oder Proc. -
extend: Fügt die gegebenen Module in die Singleton-Klasse vonselfein. -
public_send: Ruft die gegebene öffentliche Methode inselfmit dem gegebenen Argument auf. -
send: Ruft die gegebene Methode inselfmit dem gegebenen Argument auf.
Instanzvariablen
-
instance_variable_get: Gibt den Wert der gegebenen Instanzvariable inselfzurück, odernil, wenn die Instanzvariable nicht gesetzt ist. -
instance_variable_set: Setzt den Wert der gegebenen Instanzvariable inselfauf das gegebene Objekt. -
instance_variables: Gibt ein Array von Symbolnamen der Instanzvariablen inselfzurück. -
remove_instance_variable: Entfernt die benannte Instanzvariable ausself.
Sonstiges
-
clone: Gibt eine flache Kopie vonselfzurück, einschließlich Singleton-Klasse und gefrorenem Zustand. -
define_singleton_method: Definiert eine Singleton-Methode inselffür den gegebenen Symbol-Methodennamen und Block oder Proc. -
display: Gibtselfauf dem gegebenenIO-Stream oder$stdoutaus. -
dup: Gibt eine flache, nicht-gefrorene Kopie vonselfzurück. -
enum_for(alias fürto_enum): Gibt einenEnumeratorfürselfzurück, indem die gegebene Methode, Argumente und der Block verwendet werden. -
extend: Fügt die gegebenen Module in die Singleton-Klasse vonselfein. -
freeze: Verhindert weitere Änderungen anself. -
hash: Gibt den ganzzahligen Hash-Wert fürselfzurück. -
inspect: Gibt eine menschenlesbare String-Repräsentation vonselfzurück. -
itself: Gibtselfzurück. -
method_missing: Methode, die aufgerufen wird, wenn eine undefinierte Methode aufselfaufgerufen wird. -
public_send: Ruft die gegebene öffentliche Methode inselfmit dem gegebenen Argument auf. -
send: Ruft die gegebene Methode inselfmit dem gegebenen Argument auf. -
to_s: Gibt eine String-Repräsentation vonselfzurück.
Constants
- ARGF
-
ARGFist ein Stream, der für die Verwendung in Skripten entwickelt wurde, die Dateien verarbeiten, die als Kommandozeilenargumente übergeben werden oder überSTDINbereitgestellt werden.Siehe
ARGF(die Klasse) für weitere Details. - ARGV
-
ARGVenthält die Kommandozeilenargumente, die zum Ausführen von Ruby verwendet wurden.Eine Bibliothek wie
OptionParserkann zur Verarbeitung von Kommandozeilenargumenten verwendet werden. - CROSS_COMPILING
-
Nicht-nil, wenn für Cross-Kompilierung konfiguriert.
- DATA
-
DATAist eineFile, die den Datenabschnitt der ausgeführten Datei enthält. Um einen Datenabschnitt zu erstellen, verwenden Sie__END__$ cat t.rb puts DATA.gets __END__ hello world! $ ruby t.rb hello world!
- ENV
-
ENVist ein Hash-ähnlicher Zugriffsmechanismus für Umgebungsvariablen.Siehe
ENV(die Klasse) für weitere Details. - Ripper
-
Dies schreibt die Prism-Ripper-Übersetzung in die
Ripper-Konstante, damit BenutzerRippertransparent ohne Änderungen verwenden können. - STDERR
-
Hält die ursprüngliche stderr
- STDIN
-
Hält die ursprüngliche stdin
- STDOUT
-
Hält die ursprüngliche stdout
- TOPLEVEL_BINDING
-
Die
Bindingdes Top-Level-Scopes
Öffentliche Klassenmethoden
Source
# File ext/psych/lib/psych/core_ext.rb, line 3 def self.yaml_tag url Psych.add_tag(url, self) end
Öffentliche Instanzmethoden
Source
static VALUE
rb_obj_not_match(VALUE obj1, VALUE obj2)
{
VALUE result = rb_funcall(obj1, id_match, 1, obj2);
return rb_obj_not(result);
}
Gibt true zurück, wenn zwei Objekte nicht übereinstimmen (unter Verwendung der =~-Methode), andernfalls false.
Source
static VALUE
rb_obj_cmp(VALUE obj1, VALUE obj2)
{
if (rb_equal(obj1, obj2))
return INT2FIX(0);
return Qnil;
}
Vergleicht self und other.
Gibt zurück
-
0, wennselfundotherdasselbe Objekt sind oder wennself == other. -
nil, andernfalls.
Beispiele
o = Object.new o <=> o # => 0 o <=> o.dup # => nil
Eine Klasse, die das Modul Comparable einbindet, sollte diese Methode durch Definition einer Instanzmethode überschreiben, die
-
Nimmt ein Argument,
other. -
Gibt zurück
-
-1, wennselfkleiner alsotherist. -
0, wennselfgleichotherist. -
1, wennselfgrößer alsotherist. -
nil, wenn die beiden Werte unvergleichlich sind.
-
Source
#define case_equal rb_equal
Source
# File lib/delegate.rb, line 395 def DelegateClass(superclass, &block) klass = Class.new(Delegator) ignores = [*::Delegator.public_api, :to_s, :inspect, :=~, :!~, :===] protected_instance_methods = superclass.protected_instance_methods protected_instance_methods -= ignores public_instance_methods = superclass.public_instance_methods public_instance_methods -= ignores normal, special = public_instance_methods.partition { |m| m.match?(/\A[a-zA-Z]\w*[!\?]?\z/) } source = normal.map do |method| "def #{method}(...); __getobj__.#{method}(...); end" end protected_instance_methods.each do |method| source << "def #{method}(...); __getobj__.__send__(#{method.inspect}, ...); end" end klass.module_eval do def __getobj__ # :nodoc: unless defined?(@delegate_dc_obj) return yield if block_given? __raise__ ::ArgumentError, "not delegated" end @delegate_dc_obj end def __setobj__(obj) # :nodoc: __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj) @delegate_dc_obj = obj end class_eval(source.join(";"), __FILE__, __LINE__) special.each do |method| define_method(method, Delegator.delegating_block(method)) end protected(*protected_instance_methods) end klass.define_singleton_method :public_instance_methods do |all=true| super(all) | superclass.public_instance_methods end klass.define_singleton_method :protected_instance_methods do |all=true| super(all) | superclass.protected_instance_methods end klass.define_singleton_method :instance_methods do |all=true| super(all) | superclass.instance_methods end klass.define_singleton_method :public_instance_method do |name| super(name) rescue NameError raise unless self.public_instance_methods.include?(name) superclass.public_instance_method(name) end klass.define_singleton_method :instance_method do |name| super(name) rescue NameError raise unless self.instance_methods.include?(name) superclass.instance_method(name) end klass.module_eval(&block) if block return klass end
Die primäre Schnittstelle zu dieser Bibliothek. Wird verwendet, um die Delegation beim Definieren Ihrer Klasse einzurichten.
class MyClass < DelegateClass(ClassToDelegateTo) # Step 1 def initialize super(obj_of_ClassToDelegateTo) # Step 2 end end
oder
MyClass = DelegateClass(ClassToDelegateTo) do # Step 1 def initialize super(obj_of_ClassToDelegateTo) # Step 2 end end
Hier ist ein Beispiel für die Verwendung von Tempfile, das eigentlich ein File-Objekt ist mit einigen speziellen Regeln bezüglich des Speicherorts und wann die File gelöscht werden soll. Das ist ein fast lehrbuchmäßiges Beispiel dafür, wie Delegation verwendet wird.
class Tempfile < DelegateClass(File) # constant and class member data initialization... def initialize(basename, tmpdir=Dir::tmpdir) # build up file path/name in var tmpname... @tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600) # ... super(@tmpfile) # below this point, all methods of File are supported... end # ... end
Source
# File ext/digest/lib/digest.rb, line 110 def Digest(name) const = name.to_sym Digest::REQUIRE_MUTEX.synchronize { # Ignore autoload's because it is void when we have #const_missing Digest.const_missing(const) } rescue LoadError # Constants do not necessarily rely on digest/*. if Digest.const_defined?(const) Digest.const_get(const) else raise end end
Gibt eine Digest-Unterklasse nach name auf threadsichere Weise zurück, auch wenn das On-Demand-Laden involviert ist.
require 'digest' Digest("MD5") # => Digest::MD5 Digest(:SHA256) # => Digest::SHA256 Digest(:Foo) # => LoadError: library not found for class Digest::Foo -- digest/foo
Source
static VALUE
rb_obj_define_method(int argc, VALUE *argv, VALUE obj)
{
VALUE klass = rb_singleton_class(obj);
const rb_scope_visibility_t scope_visi = {METHOD_VISI_PUBLIC, FALSE};
return rb_mod_define_method_with_visibility(argc, argv, klass, &scope_visi);
}
Definiert eine öffentliche Singleton-Methode im Empfänger. Der Parameter method kann ein Proc, ein Method oder ein UnboundMethod-Objekt sein. Wenn ein Block angegeben ist, wird er als Methodenrumpf verwendet. Wenn ein Block oder eine Methode Parameter hat, werden diese als Methodenparameter verwendet.
class A class << self def class_name to_s end end end A.define_singleton_method(:who_am_i) do "I am: #{class_name}" end A.who_am_i # ==> "I am: A" guy = "Bob" guy.define_singleton_method(:hello) { "#{self}: Hello there!" } guy.hello #=> "Bob: Hello there!" chris = "Chris" chris.define_singleton_method(:greet) {|greeting| "#{greeting}, I'm Chris!" } chris.greet("Hi") #=> "Hi, I'm Chris!"
Source
static VALUE
rb_obj_display(int argc, VALUE *argv, VALUE self)
{
VALUE out;
out = (!rb_check_arity(argc, 0, 1) ? rb_ractor_stdout() : argv[0]);
rb_io_write(out, self);
return Qnil;
}
Schreibt self in den gegebenen Port
1.display "cat".display [ 4, 5, 6 ].display puts
Ausgabe
1cat[4, 5, 6]
Source
VALUE
rb_obj_dup(VALUE obj)
{
VALUE dup;
if (special_object_p(obj)) {
return obj;
}
dup = rb_obj_alloc(rb_obj_class(obj));
return rb_obj_dup_setup(obj, dup);
}
Erzeugt eine flache Kopie von obj – die Instanzvariablen von obj werden kopiert, aber nicht die Objekte, auf die sie verweisen.
Diese Methode kann klassenspezifisches Verhalten aufweisen. In diesem Fall wird dieses Verhalten unter der Methode #initialize_copy der Klasse dokumentiert.
zu dup im Vergleich zu clone
Im Allgemeinen können clone und dup in abgeleiteten Klassen unterschiedliche Semantik haben. Während clone zum Duplizieren eines Objekts, einschließlich seines internen Zustands, verwendet wird, verwendet dup typischerweise die Klasse des abgeleiteten Objekts, um die neue Instanz zu erstellen.
Bei der Verwendung von dup werden keine Module kopiert, mit denen das Objekt erweitert wurde.
class Klass attr_accessor :str end module Foo def foo; 'foo'; end end s1 = Klass.new #=> #<Klass:0x401b3a38> s1.extend(Foo) #=> #<Klass:0x401b3a38> s1.foo #=> "foo" s2 = s1.clone #=> #<Klass:0x401be280> s2.foo #=> "foo" s3 = s1.dup #=> #<Klass:0x401c1084> s3.foo #=> NoMethodError: undefined method `foo' for #<Klass:0x401c1084>
Erstellt einen neuen Enumerator, der durch Aufrufen von method auf obj mit den gegebenen args (falls vorhanden) enumeriert. Was von der Methode *yielded* wurde, werden die Werte des Enumerators.
Wenn ein Block gegeben ist, wird er verwendet, um die Größe des Enumerators zu berechnen, ohne ihn durchlaufen zu müssen (siehe Enumerator#size).
Beispiele
str = "xyz" enum = str.enum_for(:each_byte) enum.each { |b| puts b } # => 120 # => 121 # => 122 # protect an array from being modified by some_method a = [1, 2, 3] some_method(a.to_enum) # String#split in block form is more memory-effective: very_large_string.split("|") { |chunk| return chunk if chunk.include?('DATE') } # This could be rewritten more idiomatically with to_enum: very_large_string.to_enum(:split, "|").lazy.grep(/DATE/).first
Es ist üblich, to_enum aufzurufen, wenn Methoden für eine generische Enumerable definiert werden, falls kein Block übergeben wird.
Hier ist ein solches Beispiel mit Parameterübergabe und einem Größenblock
module Enumerable # a generic method to repeat the values of any enumerable def repeat(n) raise ArgumentError, "#{n} is negative!" if n < 0 unless block_given? return to_enum(__method__, n) do # __method__ is :repeat here sz = size # Call size and multiply by n... sz * n if sz # but return nil if size itself is nil end end each do |*val| n.times { yield *val } end end end %i[hello world].repeat(2) { |w| puts w } # => Prints 'hello', 'hello', 'world', 'world' enum = (1..14).repeat(3) # => returns an Enumerator when called without a block enum.first(4) # => [1, 1, 1, 2] enum.size # => 42
Source
VALUE
rb_obj_equal(VALUE obj1, VALUE obj2)
{
return RBOOL(obj1 == obj2);
}
Gleichheit — Auf der Ebene von Object gibt == nur true zurück, wenn obj und other dasselbe Objekt sind. Typischerweise wird diese Methode in abgeleiteten Klassen überschrieben, um klassenspezifische Bedeutungen bereitzustellen.
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) gilt genau dann, 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 denselben Hash-Schlüssel referenzieren. Dies wird von Hash verwendet, um Mitglieder auf Gleichheit zu testen. 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? synonym mit ==. Unterklassen setzen diese Tradition normalerweise fort, indem sie eql? an ihre überschriebene ==-Methode anbinden, 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_extend(int argc, VALUE *argv, VALUE obj)
{
int i;
ID id_extend_object, id_extended;
CONST_ID(id_extend_object, "extend_object");
CONST_ID(id_extended, "extended");
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
for (i = 0; i < argc; i++) {
Check_Type(argv[i], T_MODULE);
if (FL_TEST(argv[i], RMODULE_IS_REFINEMENT)) {
rb_raise(rb_eTypeError, "Cannot extend object with refinement");
}
}
while (argc--) {
rb_funcall(argv[argc], id_extend_object, 1, obj);
rb_funcall(argv[argc], id_extended, 1, obj);
}
return obj;
}
Fügt obj die Instanzmethoden aus jedem als Parameter angegebenen Modul hinzu.
module Mod def hello "Hello from Mod.\n" end end class Klass def hello "Hello from Klass.\n" end end k = Klass.new k.hello #=> "Hello from Klass.\n" k.extend(Mod) #=> #<Klass:0x401b3bc8> k.hello #=> "Hello from Mod.\n"
Source
VALUE
rb_obj_freeze(VALUE obj)
{
if (!OBJ_FROZEN(obj)) {
OBJ_FREEZE(obj);
if (SPECIAL_CONST_P(obj)) {
rb_bug("special consts should be frozen.");
}
}
return obj;
}
Verhindert weitere Änderungen an obj. Bei einem Änderungsversuch wird ein FrozenError ausgelöst. Es gibt keine Möglichkeit, ein gefrorenes Objekt aufzutauen. Siehe auch Object#frozen?.
Diese Methode gibt self zurück.
a = [ "a", "b", "c" ] a.freeze a << "z"
ergibt
prog.rb:3:in `<<': can't modify frozen Array (FrozenError) from prog.rb:3
Objekte der folgenden Klassen sind immer gefroren: Integer, Float, Symbol.
Source
VALUE
rb_obj_hash(VALUE obj)
{
long hnum = any_hash(obj, objid_hash);
return ST2FIX(hnum);
}
Gibt den ganzzahligen Hash-Wert für self zurück; hat die Eigenschaft, dass, wenn foo.eql?(bar) gilt, dann foo.hash == bar.hash.
Die Klasse Hash verwendet sowohl hash als auch eql?, um zu bestimmen, ob zwei als Hash-Schlüssel verwendete Objekte als derselbe Schlüssel behandelt werden sollen. Ein Hash-Wert, der die Kapazität eines Integer überschreitet, wird vor der Verwendung abgeschnitten.
Viele Kernklassen überschreiben die Methode Object#hash; andere Kernklassen (z. B. Integer) berechnen den Hash intern und rufen die Methode hash nicht auf, wenn sie als Hash-Schlüssel verwendet werden.
Beim Implementieren von hash für eine benutzerdefinierte Klasse ist es bewährte Praxis, Array#hash mit dem Klassennamen und den Werten zu verwenden, die in der Instanz wichtig sind; dies nutzt die Logik dieser Methode zur sicheren und effizienten Erzeugung eines Hash-Werts.
def hash [self.class, a, b, c].hash end
Der Hash-Wert kann zwischen Aufrufen oder Implementierungen von Ruby variieren. Wenn Sie stabile Hash-ähnliche Bezeichner über Ruby-Aufrufe und -Implementierungen hinweg benötigen, verwenden Sie eine benutzerdefinierte Methode, um diese zu generieren.
Source
static VALUE
rb_obj_inspect(VALUE obj)
{
VALUE ivars = rb_check_funcall(obj, id_instance_variables_to_inspect, 0, 0);
st_index_t n = 0;
if (UNDEF_P(ivars) || NIL_P(ivars)) {
n = rb_ivar_count(obj);
ivars = Qnil;
}
else if (RB_TYPE_P(ivars, T_ARRAY)) {
n = RARRAY_LEN(ivars);
}
else {
rb_raise(
rb_eTypeError,
"Expected #instance_variables_to_inspect to return an Array or nil, but it returned %"PRIsVALUE,
rb_obj_class(ivars)
);
}
if (n > 0) {
VALUE c = rb_class_name(CLASS_OF(obj));
VALUE args[2] = {
rb_sprintf("-<%"PRIsVALUE":%p", c, (void*)obj),
ivars
};
return rb_exec_recursive(inspect_obj, obj, (VALUE)args);
}
else {
return rb_any_to_s(obj);
}
}
Gibt einen String zurück, der eine menschenlesbare Darstellung von obj enthält. Der Standard-inspect zeigt den Klassennamen des Objekts, eine Kodierung seiner Speicheradresse und eine Liste der Instanzvariablen und ihrer Werte an (durch Aufrufen von inspect für jede davon). Vom Benutzer definierte Klassen sollten diese Methode überschreiben, um eine bessere Darstellung von obj zu liefern. Beim Überschreiben dieser Methode sollte ein String zurückgegeben werden, dessen Kodierung mit der externen Standardkodierung kompatibel ist.
[ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]" Time.new.inspect #=> "2008-03-08 19:43:39 +0900" class Foo end Foo.new.inspect #=> "#<Foo:0x0300c868>" class Bar def initialize @bar = 1 end end Bar.new.inspect #=> "#<Bar:0x0300c868 @bar=1>"
Wenn obj auf instance_variables_to_inspect reagiert, werden nur die in der zurückgegebenen Array aufgeführten Instanzvariablen in den Inspect-String aufgenommen.
class DatabaseConfig def initialize(host, user, password) @host = host @user = user @password = password end private def instance_variables_to_inspect = [:@host, :@user] end conf = DatabaseConfig.new("localhost", "root", "hunter2") conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root">
Source
VALUE
rb_obj_is_instance_of(VALUE obj, VALUE c)
{
c = class_or_module_required(c);
return RBOOL(rb_obj_class(obj) == c);
}
Gibt true zurück, wenn obj eine Instanz der gegebenen Klasse ist. Siehe auch Object#kind_of?.
class A; end class B < A; end class C < B; end b = B.new b.instance_of? A #=> false b.instance_of? B #=> true b.instance_of? C #=> false
Source
static VALUE
rb_obj_ivar_defined(VALUE obj, VALUE iv)
{
ID id = id_for_var(obj, iv, instance);
if (!id) {
return Qfalse;
}
return rb_ivar_defined(obj, id);
}
Gibt true zurück, wenn die gegebene Instanzvariable in obj definiert ist. String-Argumente werden in Symbole konvertiert.
class Fred def initialize(p1, p2) @a, @b = p1, p2 end end fred = Fred.new('cat', 99) fred.instance_variable_defined?(:@a) #=> true fred.instance_variable_defined?("@b") #=> true fred.instance_variable_defined?("@c") #=> false
Source
static VALUE
rb_obj_ivar_get(VALUE obj, VALUE iv)
{
ID id = id_for_var(obj, iv, instance);
if (!id) {
return Qnil;
}
return rb_ivar_get(obj, id);
}
Gibt den Wert der gegebenen Instanzvariable zurück, oder nil, wenn die Instanzvariable nicht gesetzt ist. Der Teil @ des Variablennamens sollte für reguläre Instanzvariablen enthalten sein. Löst eine NameError-Ausnahme aus, wenn das angegebene Symbol nicht als Instanzvariablenname gültig ist. String-Argumente werden in Symbole konvertiert.
class Fred def initialize(p1, p2) @a, @b = p1, p2 end end fred = Fred.new('cat', 99) fred.instance_variable_get(:@a) #=> "cat" fred.instance_variable_get("@b") #=> 99
Source
static VALUE
rb_obj_ivar_set_m(VALUE obj, VALUE iv, VALUE val)
{
ID id = id_for_var(obj, iv, instance);
if (!id) id = rb_intern_str(iv);
return rb_ivar_set(obj, id, val);
}
Setzt die Instanzvariable mit dem Namen symbol auf das gegebene Objekt. Dies kann die vom Autor der Klasse beabsichtigte Kapselung umgehen, daher sollte sie mit Vorsicht verwendet werden. Die Variable muss vor diesem Aufruf nicht vorhanden sein. Wenn der Name der Instanzvariable als String übergeben wird, wird dieser String in ein Symbol konvertiert.
class Fred def initialize(p1, p2) @a, @b = p1, p2 end end fred = Fred.new('cat', 99) fred.instance_variable_set(:@a, 'dog') #=> "dog" fred.instance_variable_set(:@c, 'cat') #=> "cat" fred.inspect #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">"
Source
VALUE
rb_obj_instance_variables(VALUE obj)
{
VALUE ary;
ary = rb_ary_new();
rb_ivar_foreach(obj, ivar_i, ary);
return ary;
}
Gibt ein Array von Instanzvariablennamen für den Empfänger zurück. Beachten Sie, dass die bloße Definition eines Accessors nicht die entsprechende Instanzvariable erstellt.
class Fred attr_accessor :a1 def initialize @iv = 3 end end Fred.new.instance_variables #=> [:@iv]
Gibt true zurück, wenn class die Klasse von obj ist, oder wenn class eine der Oberklassen von obj oder in obj enthaltene Module ist.
module M; end class A include M end class B < A; end class C < B; end b = B.new b.is_a? A #=> true b.is_a? B #=> true b.is_a? C #=> false b.is_a? M #=> true b.kind_of? A #=> true b.kind_of? B #=> true b.kind_of? C #=> false b.kind_of? M #=> true
Source
static VALUE
rb_obj_itself(VALUE obj)
{
return obj;
}
Gibt den Empfänger zurück.
string = "my string" string.itself.object_id == string.object_id #=> true
Source
VALUE
rb_obj_is_kind_of(VALUE obj, VALUE c)
{
VALUE cl = CLASS_OF(obj);
RUBY_ASSERT(RB_TYPE_P(cl, T_CLASS));
// Fastest path: If the object's class is an exact match we know `c` is a
// class without checking type and can return immediately.
if (cl == c) return Qtrue;
// Note: YJIT needs this function to never allocate and never raise when
// `c` is a class or a module.
if (LIKELY(RB_TYPE_P(c, T_CLASS))) {
// Fast path: Both are T_CLASS
return class_search_class_ancestor(cl, c);
}
else if (RB_TYPE_P(c, T_ICLASS)) {
// First check if we inherit the includer
// If we do we can return true immediately
VALUE includer = RCLASS_INCLUDER(c);
if (cl == includer) return Qtrue;
// Usually includer is a T_CLASS here, except when including into an
// already included Module.
// If it is a class, attempt the fast class-to-class check and return
// true if there is a match.
if (RB_TYPE_P(includer, T_CLASS) && class_search_class_ancestor(cl, includer))
return Qtrue;
// We don't include the ICLASS directly, so must check if we inherit
// the module via another include
return RBOOL(class_search_ancestor(cl, RCLASS_ORIGIN(c)));
}
else if (RB_TYPE_P(c, T_MODULE)) {
// Slow path: check each ancestor in the linked list and its method table
return RBOOL(class_search_ancestor(cl, RCLASS_ORIGIN(c)));
}
else {
rb_raise(rb_eTypeError, "class or module required");
UNREACHABLE_RETURN(Qfalse);
}
}
Gibt true zurück, wenn class die Klasse von obj ist, oder wenn class eine der Oberklassen von obj oder in obj enthaltene Module ist.
module M; end class A include M end class B < A; end class C < B; end b = B.new b.is_a? A #=> true b.is_a? B #=> true b.is_a? C #=> false b.is_a? M #=> true b.kind_of? A #=> true b.kind_of? B #=> true b.kind_of? C #=> false b.kind_of? M #=> true
Source
VALUE
rb_obj_method(VALUE obj, VALUE vid)
{
return obj_method(obj, vid, FALSE);
}
Sucht die benannte Methode als Empfänger in obj und gibt ein Method-Objekt zurück (oder löst NameError aus). Das Method-Objekt fungiert als Closure in der Objektinstanz von obj, sodass Instanzvariablen und der Wert von self weiterhin verfügbar bleiben.
class Demo def initialize(n) @iv = n end def hello() "Hello, @iv = #{@iv}" end end k = Demo.new(99) m = k.method(:hello) m.call #=> "Hello, @iv = 99" l = Demo.new('Fred') m = l.method("hello") m.call #=> "Hello, @iv = Fred"
Beachten Sie, dass Method die Methode to_proc implementiert, was bedeutet, dass sie mit Iteratoren verwendet werden kann.
[ 1, 2, 3 ].each(&method(:puts)) # => prints 3 lines to stdout out = File.open('test.txt', 'w') [ 1, 2, 3 ].each(&out.method(:puts)) # => prints 3 lines to file require 'date' %w[2017-03-01 2017-03-02].collect(&Date.method(:parse)) #=> [#<Date: 2017-03-01 ((2457814j,0s,0n),+0s,2299161j)>, #<Date: 2017-03-02 ((2457815j,0s,0n),+0s,2299161j)>]
Source
VALUE
rb_obj_methods(int argc, const VALUE *argv, VALUE obj)
{
rb_check_arity(argc, 0, 1);
if (argc > 0 && !RTEST(argv[0])) {
return rb_obj_singleton_methods(argc, argv, obj);
}
return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_i);
}
Gibt eine Liste der Namen von öffentlichen und geschützten Methoden von obj zurück. Dies umfasst alle Methoden, die in den Vorfahren von obj zugänglich sind. Wenn der optionale Parameter false ist, wird ein Array von öffentlichen und geschützten Singleton-Methoden von obj zurückgegeben, das keine Methoden in Modulen enthält, die in obj eingebunden sind.
class Klass def klass_method() end end k = Klass.new k.methods[0..9] #=> [:klass_method, :nil?, :===, # :==~, :!, :eql? # :hash, :<=>, :class, :singleton_class] k.methods.length #=> 56 k.methods(false) #=> [] def k.singleton_method; end k.methods(false) #=> [:singleton_method] module M123; def m123; end end k.extend M123 k.methods(false) #=> [:singleton_method]
Source
VALUE
rb_false(VALUE obj)
{
return Qfalse;
}
Nur das Objekt nil antwortet true auf nil?.
Object.new.nil? #=> false nil.nil? #=> true
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 ganzzahlige Kennung für obj zurück.
Dieselbe Zahl wird bei allen Aufrufen von object_id für ein gegebenes Objekt zurückgegeben, und keine zwei aktiven Objekte teilen sich eine ID.
Hinweis: Einige Objekte von integrierten Klassen werden zu Optimierungszwecken wiederverwendet. Dies ist bei unmittelbaren Werten und gefrorenen String-Literalen der Fall.
BasicObject implementiert __id__, Kernel implementiert object_id.
Unmittelbare 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_obj_private_methods(int argc, const VALUE *argv, VALUE obj)
{
return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_priv_i);
}
Gibt die Liste der privaten Methoden zurück, auf die obj zugreifen kann. Wenn der Parameter all auf false gesetzt ist, werden nur die Methoden im Empfänger aufgeführt.
Source
VALUE
rb_obj_protected_methods(int argc, const VALUE *argv, VALUE obj)
{
return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_prot_i);
}
Gibt die Liste der geschützten Methoden zurück, auf die obj zugreifen kann. Wenn der Parameter all auf false gesetzt ist, werden nur die Methoden im Empfänger aufgeführt.
Source
VALUE
rb_obj_public_method(VALUE obj, VALUE vid)
{
return obj_method(obj, vid, TRUE);
}
Ähnlich wie method, sucht nur nach öffentlichen Methoden.
Source
VALUE
rb_obj_public_methods(int argc, const VALUE *argv, VALUE obj)
{
return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_pub_i);
}
Gibt die Liste der öffentlichen Methoden zurück, auf die obj zugreifen kann. Wenn der Parameter all auf false gesetzt ist, werden nur die Methoden im Empfänger aufgeführt.
Source
static VALUE
rb_f_public_send(int argc, VALUE *argv, VALUE recv)
{
return send_internal_kw(argc, argv, recv, CALL_PUBLIC);
}
Ruft die durch symbol identifizierte Methode auf und übergibt ihr alle angegebenen Argumente. Im Gegensatz zu send ruft public_send nur öffentliche Methoden auf. Wenn die Methode durch einen String identifiziert wird, wird der String in ein Symbol konvertiert.
1.public_send(:puts, "hello") # causes NoMethodError
Source
VALUE
rb_obj_remove_instance_variable(VALUE obj, VALUE name)
{
const ID id = id_for_var(obj, name, an, instance);
// Frozen check comes here because it's expected that we raise a
// NameError (from the id_for_var check) before we raise a FrozenError
rb_check_frozen(obj);
if (id) {
VALUE val = rb_ivar_delete(obj, id, Qundef);
if (!UNDEF_P(val)) return val;
}
rb_name_err_raise("instance variable %1$s not defined",
obj, name);
UNREACHABLE_RETURN(Qnil);
}
Entfernt die benannte Instanzvariable aus obj und gibt den Wert dieser Variable zurück. Der Name kann als Symbol oder als String übergeben werden.
class Dummy attr_reader :var def initialize @var = 99 end def remove remove_instance_variable(:@var) end end d = Dummy.new d.var #=> 99 d.remove #=> 99 d.var #=> nil
Source
static VALUE
obj_respond_to(int argc, VALUE *argv, VALUE obj)
{
VALUE mid, priv;
ID id;
rb_execution_context_t *ec = GET_EC();
rb_scan_args(argc, argv, "11", &mid, &priv);
if (!(id = rb_check_id(&mid))) {
VALUE ret = basic_obj_respond_to_missing(ec, CLASS_OF(obj), obj,
rb_to_symbol(mid), priv);
if (UNDEF_P(ret)) ret = Qfalse;
return ret;
}
return RBOOL(basic_obj_respond_to(ec, obj, id, !RTEST(priv)));
}
Gibt true zurück, wenn obj auf die gegebene Methode reagiert. Private und geschützte Methoden werden nur dann in die Suche einbezogen, wenn der optionale zweite Parameter zu true ausgewertet wird.
Wenn die Methode nicht implementiert ist, wie z. B. Process.fork unter Windows, File.lchmod unter GNU/Linux usw., wird false zurückgegeben.
Wenn die Methode nicht definiert ist, wird die Methode respond_to_missing? aufgerufen und das Ergebnis zurückgegeben.
Wenn der Methodenname als String übergeben wird, wird der String in ein Symbol konvertiert.
Source
static VALUE
obj_respond_to_missing(VALUE obj, VALUE mid, VALUE priv)
{
return Qfalse;
}
NICHT DIREKT VERWENDEN.
Hook-Methode, um zurückzugeben, ob obj auf die Methode id reagieren kann oder nicht.
Wenn der Methodenname als String übergeben wird, wird der String in ein Symbol konvertiert.
Siehe respond_to? und das Beispiel von BasicObject.
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 wie Socket hat. 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"
Source
static VALUE
rb_obj_singleton_class(VALUE obj)
{
return rb_singleton_class(obj);
}
Gibt die Singleton-Klasse von obj zurück. Diese Methode erstellt eine neue Singleton-Klasse, wenn obj keine hat.
Wenn obj nil, true oder false ist, gibt sie NilClass, TrueClass bzw. FalseClass zurück. Wenn obj eine Integer, ein Float oder ein Symbol ist, löst sie einen TypeError aus.
Object.new.singleton_class #=> #<Class:#<Object:0xb7ce1e24>> String.singleton_class #=> #<Class:String> nil.singleton_class #=> NilClass
Source
VALUE
rb_obj_singleton_method(VALUE obj, VALUE vid)
{
VALUE sc = rb_singleton_class_get(obj);
VALUE klass;
ID id = rb_check_id(&vid);
if (NIL_P(sc) ||
NIL_P(klass = RCLASS_ORIGIN(sc)) ||
!NIL_P(rb_special_singleton_class(obj))) {
/* goto undef; */
}
else if (! id) {
VALUE m = mnew_missing_by_name(klass, obj, &vid, FALSE, rb_cMethod);
if (m) return m;
/* else goto undef; */
}
else {
VALUE args[2] = {obj, vid};
VALUE ruby_method = rb_rescue(rb_obj_singleton_method_lookup, (VALUE)args, rb_obj_singleton_method_lookup_fail, Qfalse);
if (ruby_method) {
struct METHOD *method = (struct METHOD *)RTYPEDDATA_GET_DATA(ruby_method);
VALUE lookup_class = RBASIC_CLASS(obj);
VALUE stop_class = rb_class_superclass(sc);
VALUE method_class = method->iclass;
/* Determine if method is in singleton class, or module included in or prepended to it */
do {
if (lookup_class == method_class) {
return ruby_method;
}
lookup_class = RCLASS_SUPER(lookup_class);
} while (lookup_class && lookup_class != stop_class);
}
}
/* undef: */
vid = ID2SYM(id);
rb_name_err_raise("undefined singleton method '%1$s' for '%2$s'",
obj, vid);
UNREACHABLE_RETURN(Qundef);
}
Ähnlich wie method, sucht nur nach Singleton-Methoden.
class Demo def initialize(n) @iv = n end def hello() "Hello, @iv = #{@iv}" end end k = Demo.new(99) def k.hi "Hi, @iv = #{@iv}" end m = k.singleton_method(:hi) m.call #=> "Hi, @iv = 99" m = k.singleton_method(:hello) #=> NameError
Source
VALUE
rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj)
{
VALUE ary, klass, origin;
struct method_entry_arg me_arg;
struct rb_id_table *mtbl;
int recur = TRUE;
if (rb_check_arity(argc, 0, 1)) recur = RTEST(argv[0]);
if (RCLASS_SINGLETON_P(obj)) {
rb_singleton_class(obj);
}
klass = CLASS_OF(obj);
origin = RCLASS_ORIGIN(klass);
me_arg.list = st_init_numtable();
me_arg.recur = recur;
if (klass && RCLASS_SINGLETON_P(klass)) {
if ((mtbl = RCLASS_M_TBL(origin)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
klass = RCLASS_SUPER(klass);
}
if (recur) {
while (klass && (RCLASS_SINGLETON_P(klass) || RB_TYPE_P(klass, T_ICLASS))) {
if (klass != origin && (mtbl = RCLASS_M_TBL(klass)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
klass = RCLASS_SUPER(klass);
}
}
ary = rb_ary_new2(me_arg.list->num_entries);
st_foreach(me_arg.list, ins_methods_i, ary);
st_free_table(me_arg.list);
return ary;
}
Gibt ein Array der Namen von Singleton-Methoden für obj zurück. Wenn der optionale Parameter all wahr ist, enthält die Liste Methoden in Modulen, die in obj eingebunden sind. Es werden nur öffentliche und geschützte Singleton-Methoden zurückgegeben.
module Other def three() end end class Single def Single.four() end end a = Single.new def a.one() end class << a include Other def two() end end Single.singleton_methods #=> [:four] a.singleton_methods(false) #=> [:two, :one] a.singleton_methods #=> [:two, :one, :three]
Source
static VALUE
obj_to_enum(int argc, VALUE *argv, VALUE obj)
{
VALUE enumerator, meth = sym_each;
if (argc > 0) {
--argc;
meth = *argv++;
}
enumerator = rb_enumeratorize_with_size(obj, meth, argc, argv, 0);
if (rb_block_given_p()) {
RB_OBJ_WRITE(enumerator, &enumerator_ptr(enumerator)->size, rb_block_proc());
}
return enumerator;
}
Erstellt einen neuen Enumerator, der durch Aufrufen von method auf obj mit den gegebenen args (falls vorhanden) enumeriert. Was von der Methode *yielded* wurde, werden die Werte des Enumerators.
Wenn ein Block gegeben ist, wird er verwendet, um die Größe des Enumerators zu berechnen, ohne ihn durchlaufen zu müssen (siehe Enumerator#size).
Beispiele
str = "xyz" enum = str.enum_for(:each_byte) enum.each { |b| puts b } # => 120 # => 121 # => 122 # protect an array from being modified by some_method a = [1, 2, 3] some_method(a.to_enum) # String#split in block form is more memory-effective: very_large_string.split("|") { |chunk| return chunk if chunk.include?('DATE') } # This could be rewritten more idiomatically with to_enum: very_large_string.to_enum(:split, "|").lazy.grep(/DATE/).first
Es ist üblich, to_enum aufzurufen, wenn Methoden für eine generische Enumerable definiert werden, falls kein Block übergeben wird.
Hier ist ein solches Beispiel mit Parameterübergabe und einem Größenblock
module Enumerable # a generic method to repeat the values of any enumerable def repeat(n) raise ArgumentError, "#{n} is negative!" if n < 0 unless block_given? return to_enum(__method__, n) do # __method__ is :repeat here sz = size # Call size and multiply by n... sz * n if sz # but return nil if size itself is nil end end each do |*val| n.times { yield *val } end end end %i[hello world].repeat(2) { |w| puts w } # => Prints 'hello', 'hello', 'world', 'world' enum = (1..14).repeat(3) # => returns an Enumerator when called without a block enum.first(4) # => [1, 1, 1, 2] enum.size # => 42
Source
VALUE
rb_any_to_s(VALUE obj)
{
VALUE str;
VALUE cname = rb_class_name(CLASS_OF(obj));
str = rb_sprintf("#<%"PRIsVALUE":%p>", cname, (void*)obj);
return str;
}
Gibt einen String zurück, der obj repräsentiert. Der Standard-to_s gibt den Klassennamen des Objekts und eine Kodierung der Objekt-ID aus. Als Sonderfall gibt das Top-Level-Objekt, das der anfängliche Ausführungskontext von Ruby-Programmen ist, „main“ zurück.
Source
# File ext/psych/lib/psych/core_ext.rb, line 12 def to_yaml options = {} Psych.dump self, options end
Konvertiert ein Objekt in YAML. Weitere Informationen zu den verfügbaren options finden Sie unter Psych.dump.