class Hash
Ein Hash-Objekt ordnet jeden seiner eindeutigen Schlüssel einem bestimmten Wert zu.
Ein Hash hat gewisse Ähnlichkeiten mit einem Array, aber
-
Ein Array-Index ist immer eine Ganzzahl.
-
Ein Hash-Schlüssel kann (fast) jedes Objekt sein.
Hash-Datensyntax
Die ursprüngliche Syntax für einen Hash-Eintrag verwendet den „Hash-Raketen“, =>
h = {:foo => 0, :bar => 1, :baz => 2} h # => {foo: 0, bar: 1, baz: 2}
Alternativ, aber nur für einen Schlüssel, der ein Symbol ist, können Sie eine neuere JSON-ähnliche Syntax verwenden, bei der jedes Bareword zu einem Symbol wird
h = {foo: 0, bar: 1, baz: 2} h # => {foo: 0, bar: 1, baz: 2}
Sie können auch einen String anstelle eines Bareword verwenden
h = {'foo': 0, 'bar': 1, 'baz': 2} h # => {foo: 0, bar: 1, baz: 2}
Und Sie können die Stile mischen
h = {foo: 0, :bar => 1, 'baz': 2} h # => {foo: 0, bar: 1, baz: 2}
Aber es ist ein Fehler, die JSON-ähnliche Syntax für einen Schlüssel zu versuchen, der kein Bareword oder String ist
# Raises SyntaxError (syntax error, unexpected ':', expecting =>):
h = {0: 'zero'}
Der Wert kann weggelassen werden, was bedeutet, dass der Wert vom Kontext unter dem Namen des Schlüssels abgerufen wird
x = 0 y = 100 h = {x:, y:} h # => {x: 0, y: 100}
Häufige Verwendungen
Sie können einen Hash verwenden, um Objekten Namen zu geben
person = {name: 'Matz', language: 'Ruby'} person # => {name: "Matz", language: "Ruby"}
Sie können einen Hash verwenden, um Method-Argumenten Namen zu geben
def some_method(hash) p hash end some_method({foo: 0, bar: 1, baz: 2}) # => {foo: 0, bar: 1, baz: 2}
Hinweis: Wenn das letzte Argument in einem Methodenaufruf ein Hash ist, können die geschweiften Klammern weggelassen werden
some_method(foo: 0, bar: 1, baz: 2) # => {foo: 0, bar: 1, baz: 2}
Sie können einen Hash verwenden, um ein Objekt zu initialisieren
class Dev attr_accessor :name, :language def initialize(hash) self.name = hash[:name] self.language = hash[:language] end end matz = Dev.new(name: 'Matz', language: 'Ruby') matz # => #<Dev: @name="Matz", @language="Ruby">
Erstellen eines Hash
Sie können ein Hash-Objekt explizit mit
-
Einem Hash-Literal erstellen.
Sie können bestimmte Objekte mit umwandeln
-
Methode
Kernel#Hash.
Sie können einen Hash erstellen, indem Sie die Methode Hash.new aufrufen
# Create an empty hash. h = Hash.new h # => {} h.class # => Hash
Sie können einen Hash erstellen, indem Sie die Methode Hash.[] aufrufen
# Create an empty hash. h = Hash[] h # => {} # Create a hash with initial entries. h = Hash[foo: 0, bar: 1, baz: 2] h # => {foo: 0, bar: 1, baz: 2}
Sie können einen Hash erstellen, indem Sie seine Literalform (geschweifte Klammern) verwenden
# Create an empty hash. h = {} h # => {} # Create a +Hash+ with initial entries. h = {foo: 0, bar: 1, baz: 2} h # => {foo: 0, bar: 1, baz: 2}
Hash-Wert-Grundlagen
Der einfachste Weg, einen Hash-Wert abzurufen (Instanzmethode [])
h = {foo: 0, bar: 1, baz: 2} h[:foo] # => 0
Der einfachste Weg, einen Hash-Wert zu erstellen oder zu aktualisieren (Instanzmethode []=)
h = {foo: 0, bar: 1, baz: 2} h[:bat] = 3 # => 3 h # => {foo: 0, bar: 1, baz: 2, bat: 3} h[:foo] = 4 # => 4 h # => {foo: 4, bar: 1, baz: 2, bat: 3}
Der einfachste Weg, einen Hash-Eintrag zu löschen (Instanzmethode delete)
h = {foo: 0, bar: 1, baz: 2} h.delete(:bar) # => 1 h # => {foo: 0, baz: 2}
Eintragsreihenfolge
Ein Hash-Objekt präsentiert seine Einträge in der Reihenfolge ihrer Erstellung. Dies ist sichtbar in
-
Iterativen Methoden wie
each,each_key,each_pair,each_value. -
Andere reihenfolgeabhängige Methoden wie
shift,keys,values. -
Der von der Methode
inspectzurückgegebene String.
Ein neuer Hash hat seine anfängliche Reihenfolge gemäß den angegebenen Einträgen
h = Hash[foo: 0, bar: 1] h # => {foo: 0, bar: 1}
Neue Einträge werden am Ende hinzugefügt
h[:baz] = 2 h # => {foo: 0, bar: 1, baz: 2}
Das Aktualisieren eines Wertes beeinflusst nicht die Reihenfolge
h[:baz] = 3 h # => {foo: 0, bar: 1, baz: 3}
Aber das Neuerstellen eines gelöschten Eintrags kann die Reihenfolge beeinflussen
h.delete(:foo) h[:foo] = 5 h # => {bar: 1, baz: 3, foo: 5}
Hash Schlüssel
Hash Schlüssel-Äquivalenz
Zwei Objekte werden als derselbe Hash-Schlüssel behandelt, wenn ihr hash-Wert identisch ist und die beiden Objekte eql? zueinander sind.
Ändern eines aktiven Hash-Schlüssels
Das Ändern eines Hash-Schlüssels, während er in Gebrauch ist, beschädigt den Index des Hash.
Dieser Hash hat Schlüssel, die Arrays sind
a0 = [ :foo, :bar ] a1 = [ :baz, :bat ] h = {a0 => 0, a1 => 1} h.include?(a0) # => true h[a0] # => 0 a0.hash # => 110002110
Das Ändern eines Array-Elements a0[0] ändert seinen Hash-Wert
a0[0] = :bam a0.hash # => 1069447059
Und beschädigt den Hash-Index
h.include?(a0) # => false h[a0] # => nil
Sie können den Hash-Index mit der Methode rehash reparieren
h.rehash # => {[:bam, :bar]=>0, [:baz, :bat]=>1} h.include?(a0) # => true h[a0] # => 0
Ein String-Schlüssel ist immer sicher. Das liegt daran, dass ein nicht eingefrorener String, der als Schlüssel übergeben wird, durch eine duplizierte und eingefrorene String ersetzt wird
s = 'foo' s.frozen? # => false h = {s => 0} first_key = h.keys.first first_key.frozen? # => true
Benutzerdefinierte Hash-Schlüssel
Um als Hash-Schlüssel verwendbar zu sein, müssen Objekte die Methoden hash und eql? implementieren. Hinweis: Diese Anforderung gilt nicht, wenn der Hash compare_by_identity verwendet, da der Vergleich dann auf der Objekt-ID der Schlüssel anstelle von hash und eql? beruht.
Object definiert eine grundlegende Implementierung für hash und eq?, die jedes Objekt zu einem eigenständigen Schlüssel macht. Typischerweise möchten benutzerdefinierte Klassen diese Methoden überschreiben, um sinnvolles Verhalten zu bieten, oder z. B. Struct erben, das nützliche Definitionen dafür hat.
Eine typische Implementierung von hash basiert auf den Daten des Objekts, während eql? normalerweise mit der überschriebenen ==-Methode verknüpft ist
class Book attr_reader :author, :title def initialize(author, title) @author = author @title = title end def ==(other) self.class === other && other.author == @author && other.title == @title end alias eql? == def hash [self.class, @author, @title].hash end end book1 = Book.new 'matz', 'Ruby in a Nutshell' book2 = Book.new 'matz', 'Ruby in a Nutshell' reviews = {} reviews[book1] = 'Great reference!' reviews[book2] = 'Nice and compact!' reviews.length #=> 1
Schlüssel nicht gefunden?
Wenn eine Methode versucht, den Wert für einen Schlüssel abzurufen und zurückzugeben, und dieser Schlüssel *gefunden wird*, ist der zurückgegebene Wert der dem Schlüssel zugeordnete Wert.
Aber was ist, wenn der Schlüssel *nicht gefunden wird*? In diesem Fall geben bestimmte Methoden einen Standardwert zurück, während andere einen KeyError auslösen.
Nil-Rückgabewert
Wenn Sie möchten, dass für einen nicht gefundenen Schlüssel nil zurückgegeben wird, können Sie aufrufen
-
[](key)(normalerweise geschrieben als#[key].
Sie können diese Verhaltensweisen für [], dig und values_at (aber nicht für assoc) überschreiben; siehe Hash-Standard.
KeyError
Wenn Sie möchten, dass für einen nicht gefundenen Schlüssel ein KeyError ausgelöst wird, können Sie aufrufen
Hash-Standard
Für bestimmte Methoden ([], dig und values_at) wird der Rückgabewert für einen nicht gefundenen Schlüssel durch zwei Hash-Eigenschaften bestimmt
-
Standardwert: zurückgegeben von der Methode
default. -
Standard-Proc: zurückgegeben von der Methode
default_proc.
Im einfachen Fall sind beide Werte nil, und die Methoden geben nil für einen nicht gefundenen Schlüssel zurück; siehe Nil-Rückgabewert oben.
Beachten Sie, dass dieser gesamte Abschnitt („Hash-Standard“)
-
gilt *nicht* für die Methoden
assoc,fetchoderfetch_values, die nicht vom Standardwert oder Standard-Proc betroffen sind.
Standard für beliebigen Schlüssel
Sie können einen beliebigen Schlüssel-Standard für einen Hash definieren; das heißt, einen Wert, der für *jeden* nicht gefundenen Schlüssel zurückgegeben wird
-
Der Wert von
default_proc*muss*nilsein. -
Der Wert von
default(der jedes Objekt, einschließlichnil, sein kann) wird für einen nicht gefundenen Schlüssel zurückgegeben.
Sie können den Standardwert beim Erstellen des Hash mit Hash.new und der Option default_value, oder später mit der Methode default= setzen.
Hinweis: Obwohl der Wert von default jedes Objekt sein kann, ist es möglicherweise keine gute Idee, ein veränderliches Objekt zu verwenden.
Schlüssel-spezifische Standards
Sie können einen schlüssel-spezifischen Standard für einen Hash definieren; das heißt, ein Proc, das basierend auf dem Schlüssel selbst einen Wert zurückgibt.
Sie können den Standard-Proc beim Erstellen des Hash mit Hash.new und einem Block, oder später mit der Methode default_proc= setzen.
Beachten Sie, dass der Proc self ändern kann, aber das Ändern von self auf diese Weise ist nicht threadsicher; mehrere Threads können gleichzeitig den Standard-Proc für denselben Schlüssel aufrufen.
Methoden-Standard
Für zwei Methoden können Sie einen Standardwert für einen nicht gefundenen Schlüssel angeben, der nur für einen einzigen Methodenaufruf wirksam ist (und nicht für nachfolgende Aufrufe)
-
Für die Methode
fetchkönnen Sie einen beliebigen Schlüssel-Standard angeben -
Für entweder die Methode
fetchoder die Methodefetch_valueskönnen Sie einen schlüssel-spezifischen Standard über einen Block angeben.
Was gibt es hier
Zuerst, was anderswo ist. Klasse Hash
-
Erbt von Klasse Object.
-
Beinhaltet das Modul Enumerable, das Dutzende zusätzlicher Methoden bereitstellt.
Hier bietet die Klasse Hash Methoden, die nützlich sind für
Die Klasse Hash enthält auch Methoden aus dem Modul Enumerable.
Methoden zum Erstellen eines Hash
-
::[]: Gibt einen neuen Hash zurück, der mit den gegebenen Objekten gefüllt ist. -
::new: Gibt einen neuen leeren Hash zurück. -
::try_convert: Gibt einen neuen Hash zurück, der aus einem gegebenen Objekt erstellt wurde.
Methoden zum Festlegen des Hash-Zustands
-
compare_by_identity: Setztselfso, dass nur die Identität beim Vergleichen von Schlüsseln berücksichtigt wird. -
default=: Setzt den Standardwert auf den gegebenen Wert. -
default_proc=: Setzt den Standard-Proc auf den gegebenen Proc. -
rehash: Baut die Hash-Tabelle neu auf, indem der Hash-Index für jeden Schlüssel neu berechnet wird.
Methoden zum Abfragen
-
any?: Gibt zurück, ob ein Element ein gegebenes Kriterium erfüllt. -
compare_by_identity?: Gibt zurück, ob der Hash nur die Identität beim Vergleichen von Schlüsseln berücksichtigt. -
default: Gibt den Standardwert oder den Standardwert für einen gegebenen Schlüssel zurück. -
default_proc: Gibt den Standard-Proc zurück. -
empty?: Gibt zurück, ob keine Einträge vorhanden sind. -
eql?: Gibt zurück, ob ein gegebenes Objekt gleichselfist. -
hash: Gibt den ganzzahligen Hash-Code zurück. -
has_value?(alias alsvalue?): Gibt zurück, ob ein gegebenes Objekt ein Wert inselfist. -
include?(alias alshas_key?,member?,key?): Gibt zurück, ob ein gegebenes Objekt ein Schlüssel inselfist. -
size(alias alslength): Gibt die Anzahl der Einträge zurück.
Methoden zum Vergleichen
-
<: Gibt zurück, obselfeine echte Teilmenge eines gegebenen Objekts ist. -
<=: Gibt zurück, obselfeine Teilmenge eines gegebenen Objekts ist. -
==: Gibt zurück, ob ein gegebenes Objekt gleichselfist. -
>: Gibt zurück, obselfeine echte Obermenge eines gegebenen Objekts ist -
>=: Gibt zurück, obselfeine Obermenge eines gegebenen Objekts ist.
Methoden zum Abrufen
-
[]: Gibt den Wert zurück, der einem gegebenen Schlüssel zugeordnet ist. -
assoc: Gibt ein 2-elementiges Array zurück, das einen gegebenen Schlüssel und seinen Wert enthält. -
dig: Gibt das Objekt in verschachtelten Objekten zurück, das durch einen gegebenen Schlüssel und zusätzliche Argumente spezifiziert ist. -
fetch: Gibt den Wert für einen gegebenen Schlüssel zurück. -
fetch_values: Gibt ein Array zurück, das die Werte enthält, die den gegebenen Schlüsseln zugeordnet sind. -
key: Gibt den Schlüssel für den zuerst gefundenen Eintrag mit einem gegebenen Wert zurück. -
keys: Gibt ein Array zurück, das alle Schlüssel inselfenthält. -
rassoc: Gibt ein 2-elementiges Array zurück, das aus dem Schlüssel und Wert des zuerst gefundenen Eintrags besteht, der einen gegebenen Wert hat. -
values: Gibt ein Array zurück, das alle Werte inselfenthält. -
values_at: Gibt ein Array zurück, das Werte für gegebene Schlüssel enthält.
Methoden zum Zuweisen
-
[]=(alias alsstore): Ordnet einen gegebenen Schlüssel einem gegebenen Wert zu. -
merge: Gibt den Hash zurück, der durch Zusammenführen jedes gegebenen Hash in eine Kopie vonselfgebildet wird. -
update(alias alsmerge!): Fügt jeden gegebenen Hash inselfzusammen. -
replace(alias alsinitialize_copy): Ersetzt den gesamten Inhalt vonselfdurch den Inhalt eines gegebenen Hash.
Methoden zum Löschen
Diese Methoden entfernen Einträge aus self
-
clear: Entfernt alle Einträge ausself. -
compact!: Entfernt alle Einträge mitnil-Wert ausself. -
delete: Entfernt den Eintrag für einen gegebenen Schlüssel. -
delete_if: Entfernt Einträge, die durch einen gegebenen Block ausgewählt wurden. -
select!(alias alsfilter!): Behält nur die Einträge, die durch einen gegebenen Block ausgewählt wurden. -
keep_if: Behält nur die Einträge, die durch einen gegebenen Block ausgewählt wurden. -
reject!: Entfernt Einträge, die durch einen gegebenen Block ausgewählt wurden. -
shift: Entfernt und gibt den ersten Eintrag zurück.
Diese Methoden geben eine Kopie von self mit einigen entfernten Einträgen zurück
-
compact: Gibt eine Kopie vonselfzurück, bei der alle Einträge mitnil-Wert entfernt wurden. -
except: Gibt eine Kopie vonselfzurück, bei der Einträge für die angegebenen Schlüssel entfernt wurden. -
select(alias alsfilter): Gibt eine Kopie vonselfzurück, bei der nur die Einträge beibehalten wurden, die durch einen gegebenen Block ausgewählt wurden. -
reject: Gibt eine Kopie vonselfzurück, bei der Einträge entfernt wurden, wie durch einen gegebenen Block angegeben. -
slice: Gibt einen Hash zurück, der die Einträge für gegebene Schlüssel enthält.
Methoden zur Iteration
-
each_pair(alias alseach): Ruft einen gegebenen Block mit jedem Schlüssel-Wert-Paar auf. -
each_key: Ruft einen gegebenen Block mit jedem Schlüssel auf. -
each_value: Ruft einen gegebenen Block mit jedem Wert auf.
Methoden zur Konvertierung
-
flatten: Gibt ein Array zurück, das eine eindimensionale Abflachung vonselfist. -
inspect(alias alsto_s): Gibt einen neuenStringzurück, der die Hash-Einträge enthält. -
to_a: Gibt ein neues Array von 2-elementigen Arrays zurück; jedes verschachtelte Array enthält ein Schlüssel-Wert-Paar ausself. -
to_h: Gibtselfzurück, wenn es einHashist; wenn es eine Unterklasse vonHashist, gibt es einenHashzurück, der die Einträge vonselfenthält. -
to_hash: Gibtselfzurück. -
to_proc: Gibt einen Proc zurück, der einen gegebenen Schlüssel seinem Wert zuordnet.
Methoden zum Umwandeln von Schlüsseln und Werten
-
invert: Gibt einen Hash zurück, bei dem jedes Schlüssel-Wert-Paar umgekehrt ist. -
transform_keys: Gibt eine Kopie vonselfmit modifizierten Schlüsseln zurück. -
transform_keys!: Modifiziert Schlüssel inself -
transform_values: Gibt eine Kopie vonselfmit modifizierten Werten zurück. -
transform_values!: Modifiziert Werte inself.
Öffentliche Klassenmethoden
Source
static VALUE
rb_hash_s_create(int argc, VALUE *argv, VALUE klass)
{
VALUE hash, tmp;
if (argc == 1) {
tmp = rb_hash_s_try_convert(Qnil, argv[0]);
if (!NIL_P(tmp)) {
if (!RHASH_EMPTY_P(tmp) && rb_hash_compare_by_id_p(tmp)) {
/* hash_copy for non-empty hash will copy compare_by_identity
flag, but we don't want it copied. Work around by
converting hash to flattened array and using that. */
tmp = rb_hash_to_a(tmp);
}
else {
hash = hash_alloc(klass);
if (!RHASH_EMPTY_P(tmp))
hash_copy(hash, tmp);
return hash;
}
}
else {
tmp = rb_check_array_type(argv[0]);
}
if (!NIL_P(tmp)) {
long i;
hash = hash_alloc(klass);
for (i = 0; i < RARRAY_LEN(tmp); ++i) {
VALUE e = RARRAY_AREF(tmp, i);
VALUE v = rb_check_array_type(e);
VALUE key, val = Qnil;
if (NIL_P(v)) {
rb_raise(rb_eArgError, "wrong element type %s at %ld (expected array)",
rb_builtin_class_name(e), i);
}
switch (RARRAY_LEN(v)) {
default:
rb_raise(rb_eArgError, "invalid number of elements (%ld for 1..2)",
RARRAY_LEN(v));
case 2:
val = RARRAY_AREF(v, 1);
case 1:
key = RARRAY_AREF(v, 0);
rb_hash_aset(hash, key, val);
}
}
return hash;
}
}
if (argc % 2 != 0) {
rb_raise(rb_eArgError, "odd number of arguments for Hash");
}
hash = hash_alloc(klass);
rb_hash_bulk_insert(argc, argv, hash);
hash_verify(hash);
return hash;
}
Gibt ein neues Hash-Objekt zurück, das mit den gegebenen Objekten gefüllt ist, falls vorhanden. Siehe Hash::new.
Ohne Argument wird ein neuer leerer Hash zurückgegeben.
Mit einem einzelnen Argument other_hash, das ein Hash ist, wird ein neuer Hash zurückgegeben, der mit den Einträgen dieses Hash initialisiert ist (aber nicht mit seinem default oder default_proc).
h = {foo: 0, bar: 1, baz: 2} Hash[h] # => {foo: 0, bar: 1, baz: 2}
Mit einem einzelnen Argument 2_element_arrays, das ein Array von 2-elementigen Arrays ist, wird ein neuer Hash zurückgegeben, bei dem jedes gegebene 2-elementige Array einen Schlüssel-Wert-Eintrag bildet.
Hash[ [ [:foo, 0], [:bar, 1] ] ] # => {foo: 0, bar: 1}
Mit einer geraden Anzahl von Argumenten objects werden zurückgegeben, ein neuer Hash, bei dem jedes aufeinanderfolgende Argumentpaar ein Schlüssel-Wert-Eintrag ist.
Hash[:foo, 0, :bar, 1] # => {foo: 0, bar: 1}
Löst einen ArgumentError aus, wenn die Argumentliste nicht mit einem der obigen übereinstimmt.
Siehe auch Methoden zum Erstellen eines Hash.
Source
# File hash.rb, line 37 def initialize(ifnone = (ifnone_unset = true), capacity: 0, &block) Primitive.rb_hash_init(capacity, ifnone_unset, ifnone, block) end
Gibt ein neues leeres Hash-Objekt zurück.
Initialisiert die Werte von Hash#default und Hash#default_proc, die das Verhalten bestimmen, wenn ein gegebener Schlüssel nicht gefunden wird; siehe Schlüssel nicht gefunden?.
Standardmäßig hat ein Hash nil-Werte für sowohl default als auch default_proc
h = Hash.new # => {} h.default # => nil h.default_proc # => nil
Mit dem Argument default_value wird der default-Wert für den Hash gesetzt
h = Hash.new(false) # => {} h.default # => false h.default_proc # => nil
Mit einem gegebenen Block wird der Wert default_proc gesetzt
h = Hash.new {|hash, key| "Hash #{hash}: Default value for #{key}" } h.default # => nil h.default_proc # => #<Proc:0x00000289b6fa7048 (irb):185> h[:nosuch] # => "Hash {}: Default value for nosuch"
Löst einen ArgumentError aus, wenn sowohl default_value als auch ein Block angegeben werden.
Wenn das optionale Schlüsselwortargument capacity mit einem positiven Ganzzahlwert n angegeben wird, wird der Hash mit ausreichend Kapazität initialisiert, um n Einträge ohne Größenänderung aufzunehmen.
Siehe auch Methoden zum Erstellen eines Hash.
Source
static VALUE
rb_hash_s_ruby2_keywords_hash(VALUE dummy, VALUE hash)
{
Check_Type(hash, T_HASH);
VALUE tmp = rb_hash_dup(hash);
if (RHASH_EMPTY_P(hash) && rb_hash_compare_by_id_p(hash)) {
rb_hash_compare_by_id(tmp);
}
RHASH(tmp)->basic.flags |= RHASH_PASS_AS_KEYWORDS;
return tmp;
}
Dupliziert einen gegebenen Hash und fügt ein ruby2_keywords-Flag hinzu. Diese Methode ist nicht für den allgemeinen Gebrauch bestimmt; zum Debugging, Recherchieren und für einige wirklich notwendige Fälle wie die Deserialisierung von Argumenten.
h = {k: 1} h = Hash.ruby2_keywords_hash(h) def foo(k: 42) k end foo(*[h]) #=> 1 with neither a warning or an error
Source
static VALUE
rb_hash_s_ruby2_keywords_hash_p(VALUE dummy, VALUE hash)
{
Check_Type(hash, T_HASH);
return RBOOL(RHASH(hash)->basic.flags & RHASH_PASS_AS_KEYWORDS);
}
Prüft, ob ein gegebener Hash von Module#ruby2_keywords (oder Proc#ruby2_keywords) markiert ist. Diese Methode ist nicht für den allgemeinen Gebrauch bestimmt; zum Debugging, Recherchieren und für einige wirklich notwendige Fälle wie die Serialisierung von Argumenten.
ruby2_keywords def foo(*args) Hash.ruby2_keywords_hash?(args.last) end foo(k: 1) #=> true foo({k: 1}) #=> false
Source
static VALUE
rb_hash_s_try_convert(VALUE dummy, VALUE hash)
{
return rb_check_hash_type(hash);
}
Wenn object ein Hash ist, wird object zurückgegeben.
Andernfalls, wenn object auf :to_hash reagiert, wird object.to_hash aufgerufen; das Ergebnis wird zurückgegeben, wenn es ein Hash ist, oder ein TypeError wird ausgelöst, wenn nicht.
Andernfalls, wenn object nicht auf :to_hash reagiert, wird nil zurückgegeben.
Öffentliche Instanzmethoden
Source
static VALUE
rb_hash_lt(VALUE hash, VALUE other)
{
other = to_hash(other);
if (RHASH_SIZE(hash) >= RHASH_SIZE(other)) return Qfalse;
return hash_le(hash, other);
}
Gibt zurück, ob die Einträge von self eine echte Teilmenge der Einträge von other sind
h = {foo: 0, bar: 1} h < {foo: 0, bar: 1, baz: 2} # => true # Proper subset. h < {baz: 2, bar: 1, foo: 0} # => true # Order may differ. h < h # => false # Not a proper subset. h < {bar: 1, foo: 0} # => false # Not a proper subset. h < {foo: 0, bar: 1, baz: 2} # => false # Different key. h < {foo: 0, bar: 1, baz: 2} # => false # Different value.
Siehe Hash-Inklusion.
Löst einen TypeError aus, wenn other_hash kein Hash ist und nicht in einen Hash konvertiert werden kann.
Verwandt: siehe Methoden zum Vergleichen.
Source
static VALUE
rb_hash_le(VALUE hash, VALUE other)
{
other = to_hash(other);
if (RHASH_SIZE(hash) > RHASH_SIZE(other)) return Qfalse;
return hash_le(hash, other);
}
Gibt zurück, ob die Einträge von self eine Teilmenge der Einträge von other sind
h0 = {foo: 0, bar: 1} h1 = {foo: 0, bar: 1, baz: 2} h0 <= h0 # => true h0 <= h1 # => true h1 <= h0 # => false
Siehe Hash-Inklusion.
Löst einen TypeError aus, wenn other_hash kein Hash ist und nicht in einen Hash konvertiert werden kann.
Verwandt: siehe Methoden zum Vergleichen.
Source
static VALUE
rb_hash_equal(VALUE hash1, VALUE hash2)
{
return hash_equal(hash1, hash2, FALSE);
}
Gibt zurück, ob self und object gleich sind.
Gibt true zurück, wenn alle folgenden Bedingungen erfüllt sind
-
objectist einHash-Objekt (oder kann in eines konvertiert werden). -
selfundobjecthaben dieselben Schlüssel (unabhängig von der Reihenfolge). -
Für jeden Schlüssel
keygiltself[key] == object[key].
Andernfalls wird false zurückgegeben.
Beispiele
h = {foo: 0, bar: 1} h == {foo: 0, bar: 1} # => true # Equal entries (same order) h == {bar: 1, foo: 0} # => true # Equal entries (different order). h == 1 # => false # Object not a hash. h == {} # => false # Different number of entries. h == {foo: 0, bar: 1} # => false # Different key. h == {foo: 0, bar: 1} # => false # Different value.
Verwandt: siehe Methoden zum Vergleichen.
Source
static VALUE
rb_hash_gt(VALUE hash, VALUE other)
{
other = to_hash(other);
if (RHASH_SIZE(hash) <= RHASH_SIZE(other)) return Qfalse;
return hash_le(other, hash);
}
Gibt true zurück, wenn die Einträge von self eine echte Obermenge der Einträge von other_hash sind, andernfalls false
h = {foo: 0, bar: 1, baz: 2} h > {foo: 0, bar: 1} # => true # Proper superset. h > {bar: 1, foo: 0} # => true # Order may differ. h > h # => false # Not a proper superset. h > {baz: 2, bar: 1, foo: 0} # => false # Not a proper superset. h > {foo: 0, bar: 1} # => false # Different key. h > {foo: 0, bar: 1} # => false # Different value.
Siehe Hash-Inklusion.
Löst einen TypeError aus, wenn other_hash kein Hash ist und nicht in einen Hash konvertiert werden kann.
Verwandt: siehe Methoden zum Vergleichen.
Source
static VALUE
rb_hash_ge(VALUE hash, VALUE other)
{
other = to_hash(other);
if (RHASH_SIZE(hash) < RHASH_SIZE(other)) return Qfalse;
return hash_le(other, hash);
}
Gibt true zurück, wenn die Einträge von self eine Obermenge der Einträge von other_hash sind, andernfalls false
h0 = {foo: 0, bar: 1, baz: 2} h1 = {foo: 0, bar: 1} h0 >= h1 # => true h0 >= h0 # => true h1 >= h0 # => false
Siehe Hash-Inklusion.
Löst einen TypeError aus, wenn other_hash kein Hash ist und nicht in einen Hash konvertiert werden kann.
Verwandt: siehe Methoden zum Vergleichen.
Source
VALUE
rb_hash_aref(VALUE hash, VALUE key)
{
st_data_t val;
if (hash_stlike_lookup(hash, key, &val)) {
return (VALUE)val;
}
else {
return rb_hash_default_value(hash, key);
}
}
Sucht nach einem Hash-Schlüssel, der dem gegebenen key entspricht; siehe Hash-Schlüssel-Äquivalenz.
Wenn der Schlüssel gefunden wird, wird sein Wert zurückgegeben
{foo: 0, bar: 1, baz: 2}
h[:bar] # => 1
Andernfalls wird ein Standardwert zurückgegeben (siehe Hash-Standard).
Verwandt: []=; siehe auch Methoden zum Abrufen.
Source
VALUE
rb_hash_aset(VALUE hash, VALUE key, VALUE val)
{
bool iter_p = hash_iterating_p(hash);
rb_hash_modify(hash);
if (!RHASH_STRING_KEY_P(hash, key)) {
RHASH_UPDATE_ITER(hash, iter_p, key, hash_aset, val);
}
else {
RHASH_UPDATE_ITER(hash, iter_p, key, hash_aset_str, val);
}
return val;
}
Ordnet das gegebene object dem gegebenen key zu; gibt object zurück.
Sucht nach einem Hash-Schlüssel, der dem gegebenen key entspricht; siehe Hash-Schlüssel-Äquivalenz.
Wenn der Schlüssel gefunden wird, wird sein Wert durch das gegebene object ersetzt; die Reihenfolge wird nicht beeinflusst (siehe Eintragsreihenfolge)
h = {foo: 0, bar: 1} h[:foo] = 2 # => 2 h[:foo] # => 2
Wenn key nicht gefunden wird, wird ein neuer Eintrag für den gegebenen key und object erstellt; der neue Eintrag ist der letzte in der Reihenfolge (siehe Eintragsreihenfolge)
h = {foo: 0, bar: 1} h[:baz] = 2 # => 2 h[:baz] # => 2 h # => {:foo=>0, :bar=>1, :baz=>2}
Verwandt: []; siehe auch Methoden zum Zuweisen.
Source
static VALUE
rb_hash_any_p(int argc, VALUE *argv, VALUE hash)
{
VALUE args[2];
args[0] = Qfalse;
rb_check_arity(argc, 0, 1);
if (RHASH_EMPTY_P(hash)) return Qfalse;
if (argc) {
if (rb_block_given_p()) {
rb_warn("given block not used");
}
args[1] = argv[0];
rb_hash_foreach(hash, any_p_i_pattern, (VALUE)args);
}
else {
if (!rb_block_given_p()) {
/* yields pairs, never false */
return Qtrue;
}
if (rb_block_pair_yield_optimizable())
rb_hash_foreach(hash, any_p_i_fast, (VALUE)args);
else
rb_hash_foreach(hash, any_p_i, (VALUE)args);
}
return args[0];
}
Gibt true zurück, wenn ein beliebiges Element ein gegebenes Kriterium erfüllt; andernfalls false.
Wenn self kein Element hat, wird false zurückgegeben und Argument oder Block werden nicht verwendet; andernfalls verhält es sich wie unten beschrieben.
Ohne Argument und ohne Block gibt true zurück, wenn self nicht leer ist, andernfalls false.
Mit dem Argument entry und ohne Block wird true zurückgegeben, wenn für einen beliebigen Schlüssel key self.assoc(key) == entry gilt, andernfalls false
h = {foo: 0, bar: 1, baz: 2} h.assoc(:bar) # => [:bar, 1] h.any?([:bar, 1]) # => true h.any?([:bar, 0]) # => false
Ohne Argument und mit einem gegebenen Block wird der Block mit jedem Schlüssel-Wert-Paar aufgerufen; gibt true zurück, wenn der Block einen wahrheitsgemäßen Wert zurückgibt, andernfalls false
h = {foo: 0, bar: 1, baz: 2} h.any? {|key, value| value < 3 } # => true h.any? {|key, value| value > 3 } # => false
Mit sowohl dem Argument entry als auch einem gegebenen Block wird eine Warnung ausgegeben und der Block ignoriert.
Verwandt: Enumerable#any? (das diese Methode überschreibt); siehe auch Methoden zum Abrufen.
Source
static VALUE
rb_hash_assoc(VALUE hash, VALUE key)
{
VALUE args[2];
if (RHASH_EMPTY_P(hash)) return Qnil;
if (RHASH_ST_TABLE_P(hash) && !RHASH_IDENTHASH_P(hash)) {
VALUE value = Qundef;
st_table assoctable = *RHASH_ST_TABLE(hash);
assoctable.type = &(struct st_hash_type){
.compare = assoc_cmp,
.hash = assoctable.type->hash,
};
VALUE arg = (VALUE)&(struct assoc_arg){
.tbl = &assoctable,
.key = (st_data_t)key,
};
if (RB_OBJ_FROZEN(hash)) {
value = assoc_lookup(arg);
}
else {
hash_iter_lev_inc(hash);
value = rb_ensure(assoc_lookup, arg, hash_foreach_ensure, hash);
}
hash_verify(hash);
if (!UNDEF_P(value)) return rb_assoc_new(key, value);
}
args[0] = key;
args[1] = Qnil;
rb_hash_foreach(hash, assoc_i, (VALUE)args);
return args[1];
}
Wenn der gegebene key gefunden wird, wird sein Eintrag als 2-elementiges Array zurückgegeben, das diesen Schlüssel und seinen Wert enthält.
h = {foo: 0, bar: 1, baz: 2} h.assoc(:bar) # => [:bar, 1]
Gibt nil zurück, wenn der Schlüssel nicht gefunden wird.
Verwandt: siehe Methoden zum Abrufen.
Source
VALUE
rb_hash_clear(VALUE hash)
{
rb_hash_modify_check(hash);
if (hash_iterating_p(hash)) {
rb_hash_foreach(hash, clear_i, 0);
}
else if (RHASH_AR_TABLE_P(hash)) {
ar_clear(hash);
}
else {
st_clear(RHASH_ST_TABLE(hash));
compact_after_delete(hash);
}
return hash;
}
Entfernt alle Einträge aus self; gibt das geleerte self zurück.
Verwandt: siehe Methoden zum Löschen.
Source
static VALUE
rb_hash_compact(VALUE hash)
{
VALUE result = rb_hash_dup(hash);
if (!RHASH_EMPTY_P(hash)) {
rb_hash_foreach(result, delete_if_nil, result);
compact_after_delete(result);
}
else if (rb_hash_compare_by_id_p(hash)) {
result = rb_hash_compare_by_id(result);
}
return result;
}
Gibt eine Kopie von self zurück, bei der alle Einträge mit nil-Wert entfernt wurden.
h = {foo: 0, bar: nil, baz: 2, bat: nil} h.compact # => {foo: 0, baz: 2}
Verwandt: siehe Methoden zum Löschen.
Source
static VALUE
rb_hash_compact_bang(VALUE hash)
{
st_index_t n;
rb_hash_modify_check(hash);
n = RHASH_SIZE(hash);
if (n) {
rb_hash_foreach(hash, delete_if_nil, hash);
if (n != RHASH_SIZE(hash))
return hash;
}
return Qnil;
}
Wenn self nil-wertige Einträge enthält, wird self mit allen entfernten nil-wertigen Einträgen zurückgegeben; andernfalls wird nil zurückgegeben.
h = {foo: 0, bar: nil, baz: 2, bat: nil} h.compact! h # => {foo: 0, baz: 2} h.compact! # => nil
Verwandt: siehe Methoden zum Löschen.
Source
VALUE
rb_hash_compare_by_id(VALUE hash)
{
VALUE tmp;
st_table *identtable;
if (rb_hash_compare_by_id_p(hash)) return hash;
rb_hash_modify_check(hash);
if (hash_iterating_p(hash)) {
rb_raise(rb_eRuntimeError, "compare_by_identity during iteration");
}
if (RHASH_TABLE_EMPTY_P(hash)) {
// Fast path: There's nothing to rehash, so we don't need a `tmp` table.
// We're most likely an AR table, so this will need an allocation.
ar_force_convert_table(hash, __FILE__, __LINE__);
HASH_ASSERT(RHASH_ST_TABLE_P(hash));
RHASH_ST_TABLE(hash)->type = &identhash;
}
else {
// Slow path: Need to rehash the members of `self` into a new
// `tmp` table using the new `identhash` compare/hash functions.
tmp = hash_alloc(0);
hash_st_table_init(tmp, &identhash, RHASH_SIZE(hash));
identtable = RHASH_ST_TABLE(tmp);
rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tmp);
rb_hash_free(hash);
// We know for sure `identtable` is an st table,
// so we can skip `ar_force_convert_table` here.
RHASH_ST_TABLE_SET(hash, identtable);
RHASH_ST_CLEAR(tmp);
}
return hash;
}
Setzt self so, dass Schlüssel anhand der *Identität* (statt nur der *Gleichheit*) verglichen werden; gibt self zurück.
Standardmäßig gelten zwei Schlüssel als derselbe Schlüssel, wenn und nur wenn sie *gleiche* Objekte sind (gemäß Methode eql?).
h = {} h['x'] = 0 h['x'] = 1 # Overwrites. h # => {"x"=>1}
Wenn diese Methode aufgerufen wurde, gelten zwei Schlüssel als derselbe Schlüssel, wenn und nur wenn sie das *selbe* Objekt sind.
h.compare_by_identity h['x'] = 2 # Does not overwrite. h # => {"x"=>1, "x"=>2}
Verwandt: compare_by_identity?; siehe auch Methoden zum Vergleichen.
Source
VALUE
rb_hash_compare_by_id_p(VALUE hash)
{
return RBOOL(RHASH_IDENTHASH_P(hash));
}
Gibt zurück, ob compare_by_identity aufgerufen wurde.
h = {} h.compare_by_identity? # => false h.compare_by_identity h.compare_by_identity? # => true
Verwandt: compare_by_identity; siehe auch Methoden zum Vergleichen.
Source
static VALUE
rb_hash_default(int argc, VALUE *argv, VALUE hash)
{
VALUE ifnone;
rb_check_arity(argc, 0, 1);
ifnone = RHASH_IFNONE(hash);
if (FL_TEST(hash, RHASH_PROC_DEFAULT)) {
if (argc == 0) return Qnil;
return call_default_proc(ifnone, hash, argv[0]);
}
return ifnone;
}
Gibt den Standardwert für den gegebenen key zurück. Der zurückgegebene Wert wird entweder durch den Standard-Proc oder durch den Standardwert bestimmt. Siehe Hash-Standard.
Ohne Argument wird der aktuelle Standardwert zurückgegeben.
h = {} h.default # => nil
Wenn key angegeben ist, wird der Standardwert für key zurückgegeben, unabhängig davon, ob dieser Schlüssel existiert.
h = Hash.new { |hash, key| hash[key] = "No key #{key}"} h[:foo] = "Hello" h.default(:foo) # => "No key foo"
Source
VALUE
rb_hash_set_default(VALUE hash, VALUE ifnone)
{
rb_hash_modify_check(hash);
SET_DEFAULT(hash, ifnone);
return ifnone;
}
Setzt den Standardwert auf value; gibt value zurück.
h = {} h.default # => nil h.default = false # => false h.default # => false
Siehe Hash-Standard.
Source
static VALUE
rb_hash_default_proc(VALUE hash)
{
if (FL_TEST(hash, RHASH_PROC_DEFAULT)) {
return RHASH_IFNONE(hash);
}
return Qnil;
}
Gibt den Standard-Proc für self zurück (siehe Hash-Standard).
h = {} h.default_proc # => nil h.default_proc = proc {|hash, key| "Default value for #{key}" } h.default_proc.class # => Proc
Source
VALUE
rb_hash_set_default_proc(VALUE hash, VALUE proc)
{
VALUE b;
rb_hash_modify_check(hash);
if (NIL_P(proc)) {
SET_DEFAULT(hash, proc);
return proc;
}
b = rb_check_convert_type_with_id(proc, T_DATA, "Proc", idTo_proc);
if (NIL_P(b) || !rb_obj_is_proc(b)) {
rb_raise(rb_eTypeError,
"wrong default_proc type %s (expected Proc)",
rb_obj_classname(proc));
}
proc = b;
SET_PROC_DEFAULT(hash, proc);
return proc;
}
Setzt den Standard-Proc für self auf proc (siehe Hash-Standard).
h = {} h.default_proc # => nil h.default_proc = proc { |hash, key| "Default value for #{key}" } h.default_proc.class # => Proc h.default_proc = nil h.default_proc # => nil
Source
static VALUE
rb_hash_delete_m(VALUE hash, VALUE key)
{
VALUE val;
rb_hash_modify_check(hash);
val = rb_hash_delete_entry(hash, key);
if (!UNDEF_P(val)) {
compact_after_delete(hash);
return val;
}
else {
if (rb_block_given_p()) {
return rb_yield(key);
}
else {
return Qnil;
}
}
}
Wenn ein Eintrag für den gegebenen key gefunden wird, wird der Eintrag gelöscht und sein zugeordneter Wert zurückgegeben; andernfalls wird nil zurückgegeben oder der gegebene Block aufgerufen.
Ohne gegebenen Block und bei gefundenem key wird der Eintrag gelöscht und sein Wert zurückgegeben.
h = {foo: 0, bar: 1, baz: 2} h.delete(:bar) # => 1 h # => {foo: 0, baz: 2}
Ohne gegebenen Block und bei nicht gefundenem key wird nil zurückgegeben.
Mit gegebenem Block und bei gefundenem key wird der Block ignoriert, der Eintrag gelöscht und sein Wert zurückgegeben.
h = {foo: 0, bar: 1, baz: 2} h.delete(:baz) { |key| raise 'Will never happen'} # => 2 h # => {foo: 0, bar: 1}
Mit gegebenem Block und bei nicht gefundenem key wird der Block aufgerufen und der Rückgabewert des Blocks zurückgegeben.
h = {foo: 0, bar: 1, baz: 2} h.delete(:nosuch) { |key| "Key #{key} not found" } # => "Key nosuch not found" h # => {foo: 0, bar: 1, baz: 2}
Verwandt: siehe Methoden zum Löschen.
Source
VALUE
rb_hash_delete_if(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
rb_hash_modify_check(hash);
if (!RHASH_TABLE_EMPTY_P(hash)) {
rb_hash_foreach(hash, delete_if_i, hash);
compact_after_delete(hash);
}
return hash;
}
Mit einem gegebenen Block wird der Block mit jedem Schlüssel-Wert-Paar aufgerufen, jeder Eintrag, für den der Block einen wahrheitsgemäßen Wert zurückgibt, wird gelöscht, und self wird zurückgegeben.
h = {foo: 0, bar: 1, baz: 2} h.delete_if {|key, value| value > 0 } # => {foo: 0}
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Löschen.
Source
static VALUE
rb_hash_dig(int argc, VALUE *argv, VALUE self)
{
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
self = rb_hash_aref(self, *argv);
if (!--argc) return self;
++argv;
return rb_obj_dig(argc, argv, self, Qnil);
}
Findet und gibt ein Objekt in verschachtelten Objekten zurück, wie durch key und identifiers spezifiziert.
Die verschachtelten Objekte können Instanzen verschiedener Klassen sein. Siehe Dig-Methoden.
Verschachtelte Hashes
h = {foo: {bar: {baz: 2}}} h.dig(:foo) # => {bar: {baz: 2}} h.dig(:foo, :bar) # => {baz: 2} h.dig(:foo, :bar, :baz) # => 2 h.dig(:foo, :bar, :BAZ) # => nil
Verschachtelte Hashes und Arrays
h = {foo: {bar: [:a, :b, :c]}} h.dig(:foo, :bar, 2) # => :c
Wenn kein solches Objekt gefunden wird, wird der Hash-Standard zurückgegeben.
h = {foo: {bar: [:a, :b, :c]}} h.dig(:hello) # => nil h.default_proc = -> (hash, _key) { hash } h.dig(:hello, :world) # => {:foo=>{:bar=>[:a, :b, :c]}}
Verwandt: Methoden zum Abrufen.
Source
static VALUE
rb_hash_each_key(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
rb_hash_foreach(hash, each_key_i, 0);
return hash;
}
Mit einem gegebenen Block wird der Block mit jedem Schlüssel aufgerufen; self wird zurückgegeben.
h = {foo: 0, bar: 1, baz: 2} h.each_key {|key| puts key } # => {foo: 0, bar: 1, baz: 2}
Ausgabe
foo bar baz
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Iterieren.
Source
static VALUE
rb_hash_each_pair(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
if (rb_block_pair_yield_optimizable())
rb_hash_foreach(hash, each_pair_i_fast, 0);
else
rb_hash_foreach(hash, each_pair_i, 0);
return hash;
}
Mit einem gegebenen Block wird der Block mit jedem Schlüssel-Wert-Paar aufgerufen; self wird zurückgegeben.
h = {foo: 0, bar: 1, baz: 2} h.each_pair {|key, value| puts "#{key}: #{value}"} # => {foo: 0, bar: 1, baz: 2}
Ausgabe
foo: 0 bar: 1 baz: 2
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Iterieren.
Source
static VALUE
rb_hash_each_value(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
rb_hash_foreach(hash, each_value_i, 0);
return hash;
}
Mit einem gegebenen Block wird der Block mit jedem Wert aufgerufen; self wird zurückgegeben.
h = {foo: 0, bar: 1, baz: 2} h.each_value {|value| puts value } # => {foo: 0, bar: 1, baz: 2}
Ausgabe
0 1 2
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Iterieren.
Source
VALUE
rb_hash_empty_p(VALUE hash)
{
return RBOOL(RHASH_EMPTY_P(hash));
}
Gibt true zurück, wenn keine Hash-Einträge vorhanden sind, andernfalls false.
{}.empty? # => true
{foo: 0}.empty? # => false
Verwandt: siehe Methoden zum Abfragen.
Source
static VALUE
rb_hash_eql(VALUE hash1, VALUE hash2)
{
return hash_equal(hash1, hash2, TRUE);
}
Gibt true zurück, wenn alle folgenden Bedingungen erfüllt sind
-
Das gegebene
objectist einHash-Objekt. -
selfundobjecthaben dieselben Schlüssel (unabhängig von der Reihenfolge). -
Für jeden Schlüssel
keygiltself[key].eql?(object[key]).
Andernfalls wird false zurückgegeben.
h1 = {foo: 0, bar: 1, baz: 2} h2 = {foo: 0, bar: 1, baz: 2} h1.eql? h2 # => true h3 = {baz: 2, bar: 1, foo: 0} h1.eql? h3 # => true
Verwandt: siehe Methoden zum Abfragen.
Source
static VALUE
rb_hash_except(int argc, VALUE *argv, VALUE hash)
{
int i;
VALUE key, result;
result = hash_dup_with_compare_by_id(hash);
for (i = 0; i < argc; i++) {
key = argv[i];
rb_hash_delete(result, key);
}
compact_after_delete(result);
return result;
}
Gibt eine Kopie von self zurück, die Einträge für die gegebenen keys ausschließt; nicht gefundene Schlüssel werden ignoriert.
h = {foo:0, bar: 1, baz: 2} # => {:foo=>0, :bar=>1, :baz=>2} h.except(:baz, :foo) # => {:bar=>1} h.except(:bar, :nosuch) # => {:foo=>0, :baz=>2}
Verwandt: siehe Methoden zum Löschen.
Source
static VALUE
rb_hash_fetch_m(int argc, VALUE *argv, VALUE hash)
{
VALUE key;
st_data_t val;
long block_given;
rb_check_arity(argc, 1, 2);
key = argv[0];
block_given = rb_block_given_p();
if (block_given && argc == 2) {
rb_warn("block supersedes default value argument");
}
if (hash_stlike_lookup(hash, key, &val)) {
return (VALUE)val;
}
else {
if (block_given) {
return rb_yield(key);
}
else if (argc == 1) {
VALUE desc = rb_protect(rb_inspect, key, 0);
if (NIL_P(desc)) {
desc = rb_any_to_s(key);
}
desc = rb_str_ellipsize(desc, 65);
rb_key_err_raise(rb_sprintf("key not found: %"PRIsVALUE, desc), hash, key);
}
else {
return argv[1];
}
}
}
Ohne Block gibt den Wert für den gegebenen key zurück, wenn gefunden;
h = {foo: 0, bar: 1, baz: 2} h.fetch(:bar) # => 1
Wenn der Schlüssel nicht gefunden wird, wird default_value zurückgegeben, wenn angegeben, oder andernfalls ein KeyError ausgelöst.
h.fetch(:nosuch, :default) # => :default h.fetch(:nosuch) # Raises KeyError.
Mit einem gegebenen Block wird der Block mit key aufgerufen und der Rückgabewert des Blocks zurückgegeben.
{}.fetch(:nosuch) {|key| "No key #{key}"} # => "No key nosuch"
Beachten Sie, dass diese Methode weder die Werte von default noch von default_proc verwendet.
Verwandt: siehe Methoden zum Abrufen.
Source
static VALUE
rb_hash_fetch_values(int argc, VALUE *argv, VALUE hash)
{
VALUE result = rb_ary_new2(argc);
long i;
for (i=0; i<argc; i++) {
rb_ary_push(result, rb_hash_fetch(hash, argv[i]));
}
return result;
}
Wenn alle gegebenen keys gefunden werden, wird ein neues Array zurückgegeben, das die den gegebenen keys zugeordneten Werte enthält.
h = {foo: 0, bar: 1, baz: 2} h.fetch_values(:baz, :foo) # => [2, 0]
Wenn einige gegebene keys nicht gefunden werden und ein Block gegeben ist, wird der Block mit jedem nicht gefundenen Schlüssel aufgerufen und der Rückgabewert des Blocks als Wert für diesen Schlüssel verwendet.
h.fetch_values(:bar, :foo, :bad, :bam) {|key| key.to_s} # => [1, 0, "bad", "bam"]
Wenn einige gegebene keys nicht gefunden werden und kein Block gegeben ist, wird ein KeyError ausgelöst.
Verwandt: siehe Methoden zum Abrufen.
Source
static VALUE
rb_hash_flatten(int argc, VALUE *argv, VALUE hash)
{
VALUE ary;
rb_check_arity(argc, 0, 1);
if (argc) {
int level = NUM2INT(argv[0]);
if (level == 0) return rb_hash_to_a(hash);
ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
rb_hash_foreach(hash, flatten_i, ary);
level--;
if (level > 0) {
VALUE ary_flatten_level = INT2FIX(level);
rb_funcallv(ary, id_flatten_bang, 1, &ary_flatten_level);
}
else if (level < 0) {
/* flatten recursively */
rb_funcallv(ary, id_flatten_bang, 0, 0);
}
}
else {
ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
rb_hash_foreach(hash, flatten_i, ary);
}
return ary;
}
Mit einer positiven Ganzzahl depth wird ein neues Array zurückgegeben, das eine rekursive Abflachung von self bis zur gegebenen depth darstellt.
Auf jeder Rekursionsebene
-
Jedes Element, dessen Wert ein Array ist, wird „abgeflacht“ (d. h. durch seine einzelnen Array-Elemente ersetzt); siehe
Array#flatten. -
Jedes Element, dessen Wert kein Array ist, bleibt unverändert, auch wenn der Wert ein Objekt ist, das die Instanzmethode flatten hat (wie ein Hash).
Beispiele; beachten Sie, dass der Eintrag foo: {bar: 1, baz: 2} niemals abgeflacht wird.
h = {foo: {bar: 1, baz: 2}, bat: [:bam, [:bap, [:bah]]]} h.flatten(1) # => [:foo, {:bar=>1, :baz=>2}, :bat, [:bam, [:bap, [:bah]]]] h.flatten(2) # => [:foo, {:bar=>1, :baz=>2}, :bat, :bam, [:bap, [:bah]]] h.flatten(3) # => [:foo, {:bar=>1, :baz=>2}, :bat, :bam, :bap, [:bah]] h.flatten(4) # => [:foo, {:bar=>1, :baz=>2}, :bat, :bam, :bap, :bah] h.flatten(5) # => [:foo, {:bar=>1, :baz=>2}, :bat, :bam, :bap, :bah]
Mit einer negativen Ganzzahl depth werden alle Ebenen abgeflacht.
h.flatten(-1) # => [:foo, {:bar=>1, :baz=>2}, :bat, :bam, :bap, :bah]
Mit depth Null wird das Äquivalent zu to_a zurückgegeben.
h.flatten(0) # => [[:foo, {:bar=>1, :baz=>2}], [:bat, [:bam, [:bap, [:bah]]]]]
Verwandt: siehe Methoden zum Konvertieren.
Source
static VALUE
rb_hash_has_value(VALUE hash, VALUE val)
{
VALUE data[2];
data[0] = Qfalse;
data[1] = val;
rb_hash_foreach(hash, rb_hash_search_value, (VALUE)data);
return data[0];
}
Gibt zurück, ob value ein Wert in self ist.
Verwandt: Methoden zum Abfragen.
Source
static VALUE
rb_hash_hash(VALUE hash)
{
st_index_t size = RHASH_SIZE(hash);
st_index_t hval = rb_hash_start(size);
hval = rb_hash_uint(hval, (st_index_t)rb_hash_hash);
if (size) {
rb_hash_foreach(hash, hash_i, (VALUE)&hval);
}
hval = rb_hash_end(hval);
return ST2FIX(hval);
}
Gibt den Ganzzahl-Hash-Code für den Hash zurück.
Zwei Hashes haben denselben Hash-Code, wenn ihr Inhalt gleich ist (unabhängig von der Reihenfolge).
h1 = {foo: 0, bar: 1, baz: 2} h2 = {baz: 2, bar: 1, foo: 0} h2.hash == h1.hash # => true h2.eql? h1 # => true
Verwandt: siehe Methoden zum Abfragen.
Source
VALUE
rb_hash_has_key(VALUE hash, VALUE key)
{
return RBOOL(hash_stlike_lookup(hash, key, NULL));
}
Gibt zurück, ob key ein Schlüssel in self ist.
h = {foo: 0, bar: 1, baz: 2} h.include?(:bar) # => true h.include?(:BAR) # => false
Verwandt: Methoden zum Abfragen.
Source
static VALUE
rb_hash_replace(VALUE hash, VALUE hash2)
{
rb_hash_modify_check(hash);
if (hash == hash2) return hash;
if (hash_iterating_p(hash)) {
rb_raise(rb_eRuntimeError, "can't replace hash during iteration");
}
hash2 = to_hash(hash2);
COPY_DEFAULT(hash, hash2);
if (RHASH_AR_TABLE_P(hash)) {
hash_ar_free_and_clear_table(hash);
}
else {
hash_st_free_and_clear_table(hash);
}
hash_copy(hash, hash2);
return hash;
}
Source
static VALUE
rb_hash_inspect(VALUE hash)
{
if (RHASH_EMPTY_P(hash))
return rb_usascii_str_new2("{}");
return rb_exec_recursive(inspect_hash, hash, 0);
}
Gibt einen neuen String zurück, der die Hash-Einträge enthält.
h = {foo: 0, bar: 1, baz: 2} h.inspect # => "{foo: 0, bar: 1, baz: 2}"
Verwandt: siehe Methoden zum Konvertieren.
Source
static VALUE
rb_hash_invert(VALUE hash)
{
VALUE h = rb_hash_new_with_size(RHASH_SIZE(hash));
rb_hash_foreach(hash, rb_hash_invert_i, h);
return h;
}
Gibt einen neuen Hash zurück, bei dem jedes Schlüssel-Wert-Paar invertiert ist.
h = {foo: 0, bar: 1, baz: 2} h1 = h.invert h1 # => {0=>:foo, 1=>:bar, 2=>:baz}
Überschreibt wiederholte neue Schlüssel (siehe Eintragsreihenfolge).
h = {foo: 0, bar: 0, baz: 0} h.invert # => {0=>:baz}
Verwandt: siehe Methoden zum Umwandeln von Schlüsseln und Werten.
Source
static VALUE
rb_hash_keep_if(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
rb_hash_modify_check(hash);
if (!RHASH_TABLE_EMPTY_P(hash)) {
rb_hash_foreach(hash, keep_if_i, hash);
}
return hash;
}
Mit einem gegebenen Block wird der Block für jedes Schlüssel-Wert-Paar aufgerufen; der Eintrag wird beibehalten, wenn der Block einen wahrheitsgemäßen Wert zurückgibt; andernfalls wird der Eintrag gelöscht; self wird zurückgegeben.
h = {foo: 0, bar: 1, baz: 2} h.keep_if { |key, value| key.start_with?('b') } # => {bar: 1, baz: 2}
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Löschen.
Source
static VALUE
rb_hash_key(VALUE hash, VALUE value)
{
VALUE args[2];
args[0] = value;
args[1] = Qnil;
rb_hash_foreach(hash, key_i, (VALUE)args);
return args[1];
}
Gibt den Schlüssel für den zuerst gefundenen Eintrag mit dem angegebenen value zurück (siehe Eintragsreihenfolge)
h = {foo: 0, bar: 2, baz: 2} h.key(0) # => :foo h.key(2) # => :bar
Gibt nil zurück, wenn kein solcher Wert gefunden wird.
Verwandt: siehe Methoden zum Abrufen.
Source
VALUE
rb_hash_keys(VALUE hash)
{
st_index_t size = RHASH_SIZE(hash);
VALUE keys = rb_ary_new_capa(size);
if (size == 0) return keys;
if (ST_DATA_COMPATIBLE_P(VALUE)) {
RARRAY_PTR_USE(keys, ptr, {
if (RHASH_AR_TABLE_P(hash)) {
size = ar_keys(hash, ptr, size);
}
else {
st_table *table = RHASH_ST_TABLE(hash);
size = st_keys(table, ptr, size);
}
});
rb_gc_writebarrier_remember(keys);
rb_ary_set_len(keys, size);
}
else {
rb_hash_foreach(hash, keys_i, keys);
}
return keys;
}
Gibt ein neues Array zurück, das alle Schlüssel in self enthält.
h = {foo: 0, bar: 1, baz: 2} h.keys # => [:foo, :bar, :baz]
Verwandt: siehe Methoden zum Abrufen.
Source
static VALUE
rb_hash_merge(int argc, VALUE *argv, VALUE self)
{
return rb_hash_update(argc, argv, copy_compare_by_id(rb_hash_dup(self), self));
}
Jedes Argument other_hash in other_hashes muss ein Hash sein.
Mit den angegebenen Argumenten other_hashes und ohne Block wird der neue Hash zurückgegeben, der durch Zusammenführen jedes aufeinanderfolgenden other_hash in eine Kopie von self gebildet wird; diese Kopie wird zurückgegeben; für jeden aufeinanderfolgenden Eintrag in other_hash
-
Für einen neuen Schlüssel wird der Eintrag am Ende von
selfhinzugefügt. -
Bei einem doppelten Schlüssel überschreibt der Eintrag den Eintrag in
self, dessen Position unverändert bleibt.
Beispiel
h = {foo: 0, bar: 1, baz: 2} h1 = {bat: 3, bar: 4} h2 = {bam: 5, bat:6} h.merge(h1, h2) # => {foo: 0, bar: 4, baz: 2, bat: 6, bam: 5}
Mit den Argumenten other_hashes und einem gegebenen Block verhält es sich wie oben, außer dass für einen doppelten Schlüssel der überschreibende Eintrag seinen Wert nicht aus dem Eintrag in other_hash nimmt, sondern stattdessen aus dem Block.
-
Der Block wird mit dem doppelten Schlüssel und den Werten sowohl von
selfals auch vonother_hashaufgerufen. -
Der Rückgabewert des Blocks wird der neue Wert für den Eintrag in
self.
Beispiel
h = {foo: 0, bar: 1, baz: 2} h1 = {bat: 3, bar: 4} h2 = {bam: 5, bat:6} h.merge(h1, h2) { |key, old_value, new_value| old_value + new_value } # => {foo: 0, bar: 5, baz: 2, bat: 9, bam: 5}
Ohne Argumente wird eine Kopie von self zurückgegeben; der Block wird, falls gegeben, ignoriert.
Verwandt: siehe Methoden für Zuweisungen.
Source
static VALUE
rb_hash_rassoc(VALUE hash, VALUE obj)
{
VALUE args[2];
args[0] = obj;
args[1] = Qnil;
rb_hash_foreach(hash, rassoc_i, (VALUE)args);
return args[1];
}
Durchsucht self nach dem ersten Eintrag, dessen Wert == zum angegebenen value ist; siehe Eintragsreihenfolge.
Wenn der Eintrag gefunden wird, wird er als 2-Element-Array mit seinem Schlüssel und Wert zurückgegeben; wenn er nicht gefunden wird, wird nil zurückgegeben.
h = {foo: 0, bar: 1, baz: 1} h.rassoc(1) # => [:bar, 1]
Verwandt: siehe Methoden zum Abrufen.
Source
VALUE
rb_hash_rehash(VALUE hash)
{
VALUE tmp;
st_table *tbl;
if (hash_iterating_p(hash)) {
rb_raise(rb_eRuntimeError, "rehash during iteration");
}
rb_hash_modify_check(hash);
if (RHASH_AR_TABLE_P(hash)) {
tmp = hash_alloc(0);
rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tmp);
hash_ar_free_and_clear_table(hash);
ar_copy(hash, tmp);
}
else if (RHASH_ST_TABLE_P(hash)) {
st_table *old_tab = RHASH_ST_TABLE(hash);
tmp = hash_alloc(0);
hash_st_table_init(tmp, old_tab->type, old_tab->num_entries);
tbl = RHASH_ST_TABLE(tmp);
rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tmp);
hash_st_free(hash);
RHASH_ST_TABLE_SET(hash, tbl);
RHASH_ST_CLEAR(tmp);
}
hash_verify(hash);
return hash;
}
Baut die Hash-Tabelle für self neu auf, indem der Hash-Index für jeden Schlüssel neu berechnet wird; gibt self zurück. Der Aufruf dieser Methode stellt sicher, dass die Hash-Tabelle gültig ist.
Die Hash-Tabelle wird ungültig, wenn sich der Hash-Wert eines Schlüssels nach Erstellung des Eintrags geändert hat. Siehe Ändern eines aktiven Hash-Schlüssels.
Source
static VALUE
rb_hash_reject(VALUE hash)
{
VALUE result;
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
result = hash_dup_with_compare_by_id(hash);
if (!RHASH_EMPTY_P(hash)) {
rb_hash_foreach(result, delete_if_i, result);
compact_after_delete(result);
}
return result;
}
Mit einem gegebenen Block wird eine Kopie von self mit null oder mehr entfernten Einträgen zurückgegeben; der Block wird mit jedem Schlüssel-Wert-Paar aufgerufen; der Eintrag in der Kopie wird ausgeschlossen, wenn der Block einen wahrheitsgemäßen Wert zurückgibt, andernfalls wird er einbezogen.
h = {foo: 0, bar: 1, baz: 2} h.reject {|key, value| key.start_with?('b') } # => {foo: 0}
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Löschen.
Source
static VALUE
rb_hash_reject_bang(VALUE hash)
{
st_index_t n;
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
rb_hash_modify(hash);
n = RHASH_SIZE(hash);
if (!n) return Qnil;
rb_hash_foreach(hash, delete_if_i, hash);
if (n == RHASH_SIZE(hash)) return Qnil;
return hash;
}
Mit einem gegebenen Block wird der Block mit dem Schlüssel und dem Wert jedes Eintrags aufgerufen; der Eintrag wird aus self entfernt, wenn der Block einen wahrheitsgemäßen Wert zurückgibt.
Gibt self zurück, wenn Einträge entfernt wurden, andernfalls nil.
h = {foo: 0, bar: 1, baz: 2} h.reject! {|key, value| value < 2 } # => {baz: 2} h.reject! {|key, value| value < 2 } # => nil
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Löschen.
Ersetzt den gesamten Inhalt von self durch den Inhalt von other_hash; gibt self zurück.
h = {foo: 0, bar: 1, baz: 2} h.replace({bat: 3, bam: 4}) # => {bat: 3, bam: 4}
Ersetzt auch den Standardwert oder die Standard-Proc von self durch den Standardwert oder die Standard-Proc von other_hash.
h = {} other = Hash.new(:ok) h.replace(other) h.default # => :ok
Verwandt: siehe Methoden für Zuweisungen.
Source
static VALUE
rb_hash_select(VALUE hash)
{
VALUE result;
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
result = hash_dup_with_compare_by_id(hash);
if (!RHASH_EMPTY_P(hash)) {
rb_hash_foreach(result, keep_if_i, result);
compact_after_delete(result);
}
return result;
}
Mit einem gegebenen Block wird der Block mit dem Schlüssel und dem Wert jedes Eintrags aufgerufen; es wird ein neuer Hash zurückgegeben, dessen Einträge diejenigen sind, für die der Block einen wahrheitsgemäßen Wert zurückgibt.
h = {foo: 0, bar: 1, baz: 2} h.select {|key, value| value < 2 } # => {foo: 0, bar: 1}
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Löschen.
Source
static VALUE
rb_hash_select_bang(VALUE hash)
{
st_index_t n;
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
rb_hash_modify_check(hash);
n = RHASH_SIZE(hash);
if (!n) return Qnil;
rb_hash_foreach(hash, keep_if_i, hash);
if (n == RHASH_SIZE(hash)) return Qnil;
return hash;
}
Mit einem gegebenen Block wird der Block mit dem Schlüssel und dem Wert jedes Eintrags aufgerufen; jeder Eintrag in self, für den der Block false oder nil zurückgibt, wird entfernt.
Gibt self zurück, wenn Einträge entfernt wurden, andernfalls nil.
h = {foo: 0, bar: 1, baz: 2} h.select! {|key, value| value < 2 } # => {foo: 0, bar: 1} h.select! {|key, value| value < 2 } # => nil
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Löschen.
Source
static VALUE
rb_hash_shift(VALUE hash)
{
struct shift_var var;
rb_hash_modify_check(hash);
if (RHASH_AR_TABLE_P(hash)) {
var.key = Qundef;
if (!hash_iterating_p(hash)) {
if (ar_shift(hash, &var.key, &var.val)) {
return rb_assoc_new(var.key, var.val);
}
}
else {
rb_hash_foreach(hash, shift_i_safe, (VALUE)&var);
if (!UNDEF_P(var.key)) {
rb_hash_delete_entry(hash, var.key);
return rb_assoc_new(var.key, var.val);
}
}
}
if (RHASH_ST_TABLE_P(hash)) {
var.key = Qundef;
if (!hash_iterating_p(hash)) {
if (st_shift(RHASH_ST_TABLE(hash), &var.key, &var.val)) {
return rb_assoc_new(var.key, var.val);
}
}
else {
rb_hash_foreach(hash, shift_i_safe, (VALUE)&var);
if (!UNDEF_P(var.key)) {
rb_hash_delete_entry(hash, var.key);
return rb_assoc_new(var.key, var.val);
}
}
}
return Qnil;
}
Entfernt und gibt den ersten Eintrag von self als 2-Element-Array zurück; siehe Eintragsreihenfolge.
h = {foo: 0, bar: 1, baz: 2} h.shift # => [:foo, 0] h # => {bar: 1, baz: 2}
Gibt nil zurück, wenn self leer ist.
Verwandt: siehe Methoden zum Löschen.
Source
VALUE
rb_hash_size(VALUE hash)
{
return INT2FIX(RHASH_SIZE(hash));
}
Gibt die Anzahl der Einträge in self zurück.
{foo: 0, bar: 1, baz: 2}.size # => 3
Verwandt: siehe Methoden zum Abfragen.
Source
static VALUE
rb_hash_slice(int argc, VALUE *argv, VALUE hash)
{
int i;
VALUE key, value, result;
if (argc == 0 || RHASH_EMPTY_P(hash)) {
return copy_compare_by_id(rb_hash_new(), hash);
}
result = copy_compare_by_id(rb_hash_new_with_size(argc), hash);
for (i = 0; i < argc; i++) {
key = argv[i];
value = rb_hash_lookup2(hash, key, Qundef);
if (!UNDEF_P(value))
rb_hash_aset(result, key, value);
}
return result;
}
Gibt einen neuen Hash zurück, der die Einträge aus self für die angegebenen keys enthält; ignoriert alle Schlüssel, die nicht gefunden werden.
h = {foo: 0, bar: 1, baz: 2} h.slice(:baz, :foo, :nosuch) # => {baz: 2, foo: 0}
Verwandt: siehe Methoden zum Löschen.
Source
static VALUE
rb_hash_to_a(VALUE hash)
{
VALUE ary;
ary = rb_ary_new_capa(RHASH_SIZE(hash));
rb_hash_foreach(hash, to_a_i, ary);
return ary;
}
Gibt alle Elemente von self als Array von 2-Element-Arrays zurück; jedes verschachtelte Array enthält ein Schlüssel-Wert-Paar aus self.
h = {foo: 0, bar: 1, baz: 2} h.to_a # => [[:foo, 0], [:bar, 1], [:baz, 2]]
Verwandt: siehe Methoden zum Konvertieren.
Source
static VALUE
rb_hash_to_h(VALUE hash)
{
if (rb_block_given_p()) {
return rb_hash_to_h_block(hash);
}
if (rb_obj_class(hash) != rb_cHash) {
const VALUE flags = RBASIC(hash)->flags;
hash = hash_dup(hash, rb_cHash, flags & RHASH_PROC_DEFAULT);
}
return hash;
}
Mit einem gegebenen Block wird ein neuer Hash zurückgegeben, dessen Inhalt auf dem Block basiert; der Block wird mit dem Schlüssel und Wert jedes Eintrags aufgerufen; der Block sollte ein 2-Element-Array zurückgeben, das den Schlüssel und den Wert enthält, die in das zurückgegebene Array aufgenommen werden sollen.
h = {foo: 0, bar: 1, baz: 2} h.to_h {|key, value| [value, key] } # => {0 => :foo, 1 => :bar, 2 => :baz}
Ohne gegebenen Block wird self zurückgegeben, wenn self eine Instanz von Hash ist; wenn self eine Unterklasse von Hash ist, wird ein neuer Hash zurückgegeben, der den Inhalt von self enthält.
Verwandt: siehe Methoden zum Konvertieren.
Source
static VALUE
rb_hash_to_hash(VALUE hash)
{
return hash;
}
Gibt self zurück.
Verwandt: siehe Methoden zum Konvertieren.
Source
static VALUE
rb_hash_to_proc(VALUE hash)
{
return rb_func_lambda_new(hash_proc_call, hash, 1, 1);
}
Gibt ein Proc-Objekt zurück, das einen Schlüssel auf seinen Wert abbildet.
h = {foo: 0, bar: 1, baz: 2} proc = h.to_proc proc.class # => Proc proc.call(:foo) # => 0 proc.call(:bar) # => 1 proc.call(:nosuch) # => nil
Verwandt: siehe Methoden zum Konvertieren.
Source
static VALUE
rb_hash_transform_keys(int argc, VALUE *argv, VALUE hash)
{
VALUE result;
struct transform_keys_args transarg = {0};
argc = rb_check_arity(argc, 0, 1);
if (argc > 0) {
transarg.trans = to_hash(argv[0]);
transarg.block_given = rb_block_given_p();
}
else {
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
}
result = rb_hash_new();
if (!RHASH_EMPTY_P(hash)) {
if (transarg.trans) {
transarg.result = result;
rb_hash_foreach(hash, transform_keys_hash_i, (VALUE)&transarg);
}
else {
rb_hash_foreach(hash, transform_keys_i, result);
}
}
return result;
}
Mit einem Argument, einem Block oder beidem wird ein neuer Hash new_hash aus self, dem Argument und/oder dem Block abgeleitet; alle, einige oder keine seiner Schlüssel können sich von denen in self unterscheiden.
Mit einem gegebenen Block und ohne Argument werden die Schlüssel für new_hash ausschließlich durch den Block bestimmt.
Für jedes Schlüssel/Wert-Paar old_key/value in self wird der Block mit old_key aufgerufen; der Rückgabewert des Blocks wird zu new_key; es wird new_hash[new_key] = value gesetzt; ein doppelter Schlüssel überschreibt.
h = {foo: 0, bar: 1, baz: 2} h.transform_keys {|old_key| old_key.to_s } # => {"foo" => 0, "bar" => 1, "baz" => 2} h.transform_keys {|old_key| 'xxx' } # => {"xxx" => 2}
Mit dem gegebenen Argument other_hash und ohne Block kann new_hash neue Schlüssel enthalten, die von other_hash bereitgestellt werden, und unveränderte Schlüssel, die von self bereitgestellt werden.
Für jedes Schlüssel/Wert-Paar old_key/old_value in self wird nach dem Schlüssel old_key in other_hash gesucht.
-
Wenn
old_keygefunden wird, wird sein Wertother_hash[old_key]alsnew_keygenommen; es wirdnew_hash[new_key] = valuegesetzt; ein doppelter Schlüssel überschreibt.h = {foo: 0, bar: 1, baz: 2} h.transform_keys(baz: :BAZ, bar: :BAR, foo: :FOO) # => {FOO: 0, BAR: 1, BAZ: 2} h.transform_keys(baz: :FOO, bar: :FOO, foo: :FOO) # => {FOO: 2}
-
Wenn
old_keynicht gefunden wird, wirdnew_hash[old_key] = valuegesetzt; ein doppelter Schlüssel überschreibt.h = {foo: 0, bar: 1, baz: 2} h.transform_keys({}) # => {foo: 0, bar: 1, baz: 2} h.transform_keys(baz: :foo) # => {foo: 2, bar: 1}
Unbenutzte Schlüssel in other_hash werden ignoriert.
h = {foo: 0, bar: 1, baz: 2} h.transform_keys(bat: 3) # => {foo: 0, bar: 1, baz: 2}
Mit sowohl dem Argument other_hash als auch einem gegebenen Block hat new_hash neue Schlüssel, die von other_hash oder vom Block angegeben werden, und unveränderte Schlüssel, die von self bereitgestellt werden.
Für jedes Paar old_key und value in self
-
Wenn
other_hashden Schlüsselold_keyhat (mit dem Wertnew_key), wird der Block für diesen Schlüssel nicht aufgerufen; es wirdnew_hash[new_key] = valuegesetzt; ein doppelter Schlüssel überschreibt.h = {foo: 0, bar: 1, baz: 2} h.transform_keys(baz: :BAZ, bar: :BAR, foo: :FOO) {|key| fail 'Not called' } # => {FOO: 0, BAR: 1, BAZ: 2}
-
Wenn
other_hashden Schlüsselold_keynicht hat, wird der Block mitold_keyaufgerufen und dessen Rückgabewert alsnew_keygenommen; es wirdnew_hash[new_key] = valuegesetzt; ein doppelter Schlüssel überschreibt.h = {foo: 0, bar: 1, baz: 2} h.transform_keys(baz: :BAZ) {|key| key.to_s.reverse } # => {"oof" => 0, "rab" => 1, BAZ: 2} h.transform_keys(baz: :BAZ) {|key| 'ook' } # => {"ook" => 1, BAZ: 2}
Ohne Argument und ohne gegebenen Block wird ein neues Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Umwandeln von Schlüsseln und Werten.
Source
static VALUE
rb_hash_transform_keys_bang(int argc, VALUE *argv, VALUE hash)
{
VALUE trans = 0;
int block_given = 0;
argc = rb_check_arity(argc, 0, 1);
if (argc > 0) {
trans = to_hash(argv[0]);
block_given = rb_block_given_p();
}
else {
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
}
rb_hash_modify_check(hash);
if (!RHASH_TABLE_EMPTY_P(hash)) {
long i;
VALUE new_keys = hash_alloc(0);
VALUE pairs = rb_ary_hidden_new(RHASH_SIZE(hash) * 2);
rb_hash_foreach(hash, flatten_i, pairs);
for (i = 0; i < RARRAY_LEN(pairs); i += 2) {
VALUE key = RARRAY_AREF(pairs, i), new_key, val;
if (!trans) {
new_key = rb_yield(key);
}
else if (!UNDEF_P(new_key = rb_hash_lookup2(trans, key, Qundef))) {
/* use the transformed key */
}
else if (block_given) {
new_key = rb_yield(key);
}
else {
new_key = key;
}
val = RARRAY_AREF(pairs, i+1);
if (!hash_stlike_lookup(new_keys, key, NULL)) {
rb_hash_stlike_delete(hash, &key, NULL);
}
rb_hash_aset(hash, new_key, val);
rb_hash_aset(new_keys, new_key, Qnil);
}
rb_ary_clear(pairs);
rb_hash_clear(new_keys);
}
compact_after_delete(hash);
return hash;
}
Mit einem Argument, einem Block oder beidem werden Schlüssel aus dem Argument, dem Block und self abgeleitet; alle, einige oder keine der Schlüssel in self können geändert werden.
Mit einem gegebenen Block und ohne Argument werden Schlüssel nur aus dem Block abgeleitet; alle, einige oder keine der Schlüssel in self können geändert werden.
Für jedes Schlüssel/Wert-Paar old_key/value in self wird der Block mit old_key aufgerufen; der Rückgabewert des Blocks wird zu new_key; der Eintrag für old_key wird entfernt: self.delete(old_key); es wird self[new_key] = value gesetzt; ein doppelter Schlüssel überschreibt.
h = {foo: 0, bar: 1, baz: 2} h.transform_keys! {|old_key| old_key.to_s } # => {"foo" => 0, "bar" => 1, "baz" => 2} h = {foo: 0, bar: 1, baz: 2} h.transform_keys! {|old_key| 'xxx' } # => {"xxx" => 2}
Mit dem gegebenen Argument other_hash und ohne Block werden Schlüssel für self aus other_hash und self abgeleitet; alle, einige oder keine der Schlüssel in self können geändert werden.
Für jedes Schlüssel/Wert-Paar old_key/old_value in self wird nach dem Schlüssel old_key in other_hash gesucht.
-
Wenn
old_keygefunden wird, wird der Wertother_hash[old_key]alsnew_keygenommen; der Eintrag fürold_keywird entfernt:self.delete(old_key); es wirdself[new_key] = valuegesetzt; ein doppelter Schlüssel überschreibt.h = {foo: 0, bar: 1, baz: 2} h.transform_keys!(baz: :BAZ, bar: :BAR, foo: :FOO) # => {FOO: 0, BAR: 1, BAZ: 2} h = {foo: 0, bar: 1, baz: 2} h.transform_keys!(baz: :FOO, bar: :FOO, foo: :FOO) # => {FOO: 2}
-
Wenn
old_keynicht gefunden wird, passiert nichts.h = {foo: 0, bar: 1, baz: 2} h.transform_keys!({}) # => {foo: 0, bar: 1, baz: 2} h.transform_keys!(baz: :foo) # => {foo: 2, bar: 1}
Unbenutzte Schlüssel in other_hash werden ignoriert.
h = {foo: 0, bar: 1, baz: 2} h.transform_keys!(bat: 3) # => {foo: 0, bar: 1, baz: 2}
Mit sowohl dem Argument other_hash als auch einem gegebenen Block werden Schlüssel aus other_hash, dem Block und self abgeleitet; alle, einige oder keine der Schlüssel in self können geändert werden.
Für jedes Paar old_key und value in self
-
Wenn
other_hashden Schlüsselold_keyhat (mit dem Wertnew_key), wird der Block für diesen Schlüssel nicht aufgerufen; der Eintrag fürold_keywird entfernt:self.delete(old_key); es wirdself[new_key] = valuegesetzt; ein doppelter Schlüssel überschreibt.h = {foo: 0, bar: 1, baz: 2} h.transform_keys!(baz: :BAZ, bar: :BAR, foo: :FOO) {|key| fail 'Not called' } # => {FOO: 0, BAR: 1, BAZ: 2}
-
Wenn
other_hashden Schlüsselold_keynicht hat, wird der Block mitold_keyaufgerufen und dessen Rückgabewert alsnew_keygenommen; der Eintrag fürold_keywird entfernt:self.delete(old_key); es wirdself[new_key] = valuegesetzt; ein doppelter Schlüssel überschreibt.h = {foo: 0, bar: 1, baz: 2} h.transform_keys!(baz: :BAZ) {|key| key.to_s.reverse } # => {"oof" => 0, "rab" => 1, BAZ: 2} h = {foo: 0, bar: 1, baz: 2} h.transform_keys!(baz: :BAZ) {|key| 'ook' } # => {"ook" => 1, BAZ: 2}
Ohne Argument und ohne gegebenen Block wird ein neues Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Umwandeln von Schlüsseln und Werten.
Source
static VALUE
rb_hash_transform_values(VALUE hash)
{
VALUE result;
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
result = hash_dup_with_compare_by_id(hash);
SET_DEFAULT(result, Qnil);
if (!RHASH_EMPTY_P(hash)) {
transform_values(result);
compact_after_delete(result);
}
return result;
}
Mit einem gegebenen Block wird ein neuer Hash new_hash zurückgegeben; für jedes Paar key/value in self wird der Block mit value aufgerufen und sein Rückgabewert als new_value erfasst; der Eintrag key/new_value wird zu new_hash hinzugefügt.
h = {foo: 0, bar: 1, baz: 2} h1 = h.transform_values {|value| value * 100} h1 # => {foo: 0, bar: 100, baz: 200}
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Umwandeln von Schlüsseln und Werten.
Source
static VALUE
rb_hash_transform_values_bang(VALUE hash)
{
RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size);
rb_hash_modify_check(hash);
if (!RHASH_TABLE_EMPTY_P(hash)) {
transform_values(hash);
}
return hash;
}
Mit einem gegebenen Block werden die Werte von self entsprechend dem Block geändert; self wird zurückgegeben.
Für jeden Eintrag key/old_value in self wird der Block mit old_value aufgerufen, sein Rückgabewert als new_value erfasst und self[key] = new_value gesetzt.
h = {foo: 0, bar: 1, baz: 2} h.transform_values! {|value| value * 100} # => {foo: 0, bar: 100, baz: 200}
Ohne Block wird ein neuer Enumerator zurückgegeben.
Verwandt: siehe Methoden zum Umwandeln von Schlüsseln und Werten.
Source
static VALUE
rb_hash_update(int argc, VALUE *argv, VALUE self)
{
struct update_call_args args = {
.hash = self,
.argv = argv,
.argc = argc,
.block_given = rb_block_given_p(),
.iterating = false,
};
VALUE arg = (VALUE)&args;
rb_hash_modify(self);
return rb_ensure(rb_hash_update_call, arg, rb_hash_update_ensure, arg);
}
Aktualisiert Werte und/oder fügt Einträge zu self hinzu; gibt self zurück.
Jedes Argument other_hash in other_hashes muss ein Hash sein.
Ohne gegebenen Block wird für jeden aufeinanderfolgenden Eintrag key/new_value in jedem aufeinanderfolgenden other_hash
-
Wenn
keyinselfvorhanden ist, wirdself[key] = new_valuegesetzt, dessen Position unverändert bleibt.h0 = {foo: 0, bar: 1, baz: 2} h1 = {bar: 3, foo: -1} h0.update(h1) # => {foo: -1, bar: 3, baz: 2}
-
Wenn
keynicht inselfvorhanden ist, wird der Eintrag am Ende vonselfhinzugefügt.h = {foo: 0, bar: 1, baz: 2} h.update({bam: 3, bah: 4}) # => {foo: 0, bar: 1, baz: 2, bam: 3, bah: 4}
Mit einem gegebenen Block wird für jeden aufeinanderfolgenden Eintrag key/new_value in jedem aufeinanderfolgenden other_hash
-
Wenn
keyinselfvorhanden ist, wirdold_valueausself[key]abgerufen, der Block mitkey,old_valueundnew_valueaufgerufen undself[key] = new_valuegesetzt, dessen Position unverändert bleibt.season = {AB: 75, H: 20, HR: 3, SO: 17, W: 11, HBP: 3} today = {AB: 3, H: 1, W: 1} yesterday = {AB: 4, H: 2, HR: 1} season.update(yesterday, today) {|key, old_value, new_value| old_value + new_value } # => {AB: 82, H: 23, HR: 4, SO: 17, W: 12, HBP: 3}
-
Wenn
keynicht inselfvorhanden ist, wird der Eintrag am Ende vonselfhinzugefügt.h = {foo: 0, bar: 1, baz: 2} h.update({bat: 3}) { fail 'Cannot happen' } # => {foo: 0, bar: 1, baz: 2, bat: 3}
Verwandt: siehe Methoden für Zuweisungen.
Source
VALUE
rb_hash_values(VALUE hash)
{
VALUE values;
st_index_t size = RHASH_SIZE(hash);
values = rb_ary_new_capa(size);
if (size == 0) return values;
if (ST_DATA_COMPATIBLE_P(VALUE)) {
if (RHASH_AR_TABLE_P(hash)) {
rb_gc_writebarrier_remember(values);
RARRAY_PTR_USE(values, ptr, {
size = ar_values(hash, ptr, size);
});
}
else if (RHASH_ST_TABLE_P(hash)) {
st_table *table = RHASH_ST_TABLE(hash);
rb_gc_writebarrier_remember(values);
RARRAY_PTR_USE(values, ptr, {
size = st_values(table, ptr, size);
});
}
rb_ary_set_len(values, size);
}
else {
rb_hash_foreach(hash, values_i, values);
}
return values;
}
Gibt ein neues Array zurück, das alle Werte in self enthält.
h = {foo: 0, bar: 1, baz: 2} h.values # => [0, 1, 2]
Verwandt: siehe Methoden zum Abrufen.
Source
static VALUE
rb_hash_values_at(int argc, VALUE *argv, VALUE hash)
{
VALUE result = rb_ary_new2(argc);
long i;
for (i=0; i<argc; i++) {
rb_ary_push(result, rb_hash_aref(hash, argv[i]));
}
return result;
}
Gibt ein neues Array zurück, das Werte für die angegebenen keys enthält.
h = {foo: 0, bar: 1, baz: 2} h.values_at(:baz, :foo) # => [2, 0]
Der Hash-Standardwert wird für jeden nicht gefundenen Schlüssel zurückgegeben.
h.values_at(:hello, :foo) # => [nil, 0]
Verwandt: siehe Methoden zum Abrufen.