class Array
Ein Array-Objekt ist eine geordnete, ganzzahlig indizierte Sammlung von Objekten, die als Elemente bezeichnet werden; das Objekt stellt eine Array-Datenstruktur dar.
Ein Element kann jedes Objekt sein (sogar ein anderes Array); Elemente können jede Mischung von Objekten unterschiedlicher Typen sein.
Wichtige Datenstrukturen, die Arrays verwenden, sind:
Es gibt auch Array-ähnliche Datenstrukturen:
-
Assoziatives Array (siehe
Hash). -
Verzeichnis (siehe
Dir). -
Menge (siehe Set).
Array-Indizes
Die Array-Indizierung beginnt bei 0, wie in C oder Java.
Ein nicht-negativer Index ist ein Offset vom ersten Element.
-
Index 0 gibt das erste Element an.
-
Index 1 gibt das zweite Element an.
-
…
Ein negativer Index ist ein Offset, rückwärts, vom Ende des Arrays.
-
Index -1 gibt das letzte Element an.
-
Index -2 gibt das vorletzte Element an.
-
…
In- und Out-of-Range-Indizes
Ein nicht-negativer Index ist im Bereich, wenn und nur wenn er kleiner ist als die Größe des Arrays. Für ein 3-Element-Array:
-
Indizes 0 bis 2 sind im Bereich.
-
Index 3 ist außerhalb des Bereichs.
Ein negativer Index ist im Bereich, wenn und nur wenn sein Absolutwert nicht größer ist als die Größe des Arrays. Für ein 3-Element-Array:
-
Indizes -1 bis -3 sind im Bereich.
-
Index -4 ist außerhalb des Bereichs.
Effektiver Index
Obwohl der effektive Index in ein Array immer eine Ganzzahl ist, akzeptieren einige Methoden (sowohl innerhalb der Klasse Array als auch anderswo) ein oder mehrere nicht-ganzzahlige Argumente, die integer-konvertierbare Objekte sind.
Arrays erstellen
Sie können ein Array-Objekt explizit erstellen mit:
-
Ein Array-Literal
[1, 'one', :one, [2, 'two', :two]]
-
Ein %w oder %W String-Array-Literal
%w[foo bar baz] # => ["foo", "bar", "baz"] %w[1 % *] # => ["1", "%", "*"]
-
Ein %i oder %I Symbol-Array-Literal
%i[foo bar baz] # => [:foo, :bar, :baz] %i[1 % *] # => [:"1", :%, :*]
-
Methode
Kernel#ArrayArray(["a", "b"]) # => ["a", "b"] Array(1..5) # => [1, 2, 3, 4, 5] Array(key: :value) # => [[:key, :value]] Array(nil) # => [] Array(1) # => [1] Array({:a => "a", :b => "b"}) # => [[:a, "a"], [:b, "b"]]
-
Methode
Array.newArray.new # => [] Array.new(3) # => [nil, nil, nil] Array.new(4) {Hash.new} # => [{}, {}, {}, {}] Array.new(3, true) # => [true, true, true]
Beachten Sie, dass das letzte Beispiel die gleichen Objekte im Array speichert. Dies wird nur empfohlen, wenn es sich bei diesem Objekt um ein nativ unveränderliches Objekt handelt, wie z. B. ein Symbol, eine Zahl,
nil,trueoderfalse.Eine weitere Möglichkeit, ein Array mit verschiedenen Objekten mithilfe eines Blocks zu erstellen; diese Verwendung ist sicher für veränderliche Objekte wie Hashes, Strings oder andere Arrays.
Array.new(4) {|i| i.to_s } # => ["0", "1", "2", "3"]
Hier ist eine Möglichkeit, ein mehrdimensionales Array zu erstellen.
Array.new(3) {Array.new(3)} # => [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
Eine Reihe von Ruby-Methoden, sowohl im Kern als auch in der Standardbibliothek, bieten die Instanzmethode to_a, die ein Objekt in ein Array konvertiert.
-
Benchmark::Tms#to_a
-
CSV::Table#to_a
-
Gem::List#to_a
-
Racc::ISet#to_a
-
Rinda::RingFinger#to_a
-
Ripper::Lexer::Elem#to_a
Beispielverwendung
Zusätzlich zu den Methoden, die es über das Enumerable-Modul einbindet, verfügt die Klasse Array über eigene Methoden zum Zugriff, zur Suche und zur sonstigen Manipulation von Arrays.
Einige der gebräuchlichsten werden unten veranschaulicht.
Zugriff auf Elemente
Elemente in einem Array können mit der Methode Array#[] abgerufen werden. Sie kann ein einzelnes Ganzzahlargument (einen numerischen Index), ein Argumentpaar (Start und Länge) oder einen Bereich annehmen. Negative Indizes zählen vom Ende, wobei -1 das letzte Element ist.
arr = [1, 2, 3, 4, 5, 6] arr[2] #=> 3 arr[100] #=> nil arr[-3] #=> 4 arr[2, 3] #=> [3, 4, 5] arr[1..4] #=> [2, 3, 4, 5] arr[1..-3] #=> [2, 3, 4]
Eine weitere Möglichkeit, auf ein bestimmtes Array-Element zuzugreifen, ist die Verwendung der Methode at.
arr.at(0) #=> 1
Die Methode slice funktioniert identisch mit Array#[].
Um einen Fehler für Indizes außerhalb des Array-Bereichs auszulösen oder einen Standardwert bereitzustellen, wenn dies geschieht, können Sie fetch verwenden.
arr = ['a', 'b', 'c', 'd', 'e', 'f'] arr.fetch(100) #=> IndexError: index 100 outside of array bounds: -6...6 arr.fetch(100, "oops") #=> "oops"
Die speziellen Methoden first und last geben das erste bzw. letzte Element eines Arrays zurück.
arr.first #=> 1 arr.last #=> 6
Um die ersten n Elemente eines Arrays zurückzugeben, verwenden Sie take.
arr.take(3) #=> [1, 2, 3]
drop macht das Gegenteil von take, indem es die Elemente zurückgibt, nachdem n Elemente verworfen wurden.
arr.drop(3) #=> [4, 5, 6]
Informationen über ein Array erhalten
Ein Array verfolgt seine eigene Länge jederzeit. Um ein Array nach der Anzahl der darin enthaltenen Elemente abzufragen, verwenden Sie length, count oder size.
browsers = ['Chrome', 'Firefox', 'Safari', 'Opera', 'IE'] browsers.length #=> 5 browsers.count #=> 5
Um zu prüfen, ob ein Array überhaupt Elemente enthält:
browsers.empty? #=> false
Um zu prüfen, ob ein bestimmter Eintrag im Array enthalten ist:
browsers.include?('Konqueror') #=> false
Elemente zu einem Array hinzufügen
Elemente können am Ende eines Arrays hinzugefügt werden, indem entweder push oder << verwendet wird.
arr = [1, 2, 3, 4] arr.push(5) #=> [1, 2, 3, 4, 5] arr << 6 #=> [1, 2, 3, 4, 5, 6]
unshift fügt ein neues Element am Anfang eines Arrays hinzu.
arr.unshift(0) #=> [0, 1, 2, 3, 4, 5, 6]
Mit insert können Sie ein neues Element an jeder beliebigen Position in ein Array einfügen.
arr.insert(3, 'apple') #=> [0, 1, 2, 'apple', 3, 4, 5, 6]
Mithilfe der Methode insert können Sie auch mehrere Werte auf einmal einfügen.
arr.insert(3, 'orange', 'pear', 'grapefruit') #=> [0, 1, 2, "orange", "pear", "grapefruit", "apple", 3, 4, 5, 6]
Elemente aus einem Array entfernen
Die Methode pop entfernt das letzte Element aus einem Array und gibt es zurück.
arr = [1, 2, 3, 4, 5, 6] arr.pop #=> 6 arr #=> [1, 2, 3, 4, 5]
Um das erste Element abzurufen und gleichzeitig zu entfernen, verwenden Sie shift.
arr.shift #=> 1 arr #=> [2, 3, 4, 5]
Um ein Element an einem bestimmten Index zu löschen:
arr.delete_at(2) #=> 4 arr #=> [2, 3, 5]
Um ein bestimmtes Element irgendwo in einem Array zu löschen, verwenden Sie delete.
arr = [1, 2, 2, 3] arr.delete(2) #=> 2 arr #=> [1,3]
Eine nützliche Methode, wenn Sie nil-Werte aus einem Array entfernen müssen, ist compact.
arr = ['foo', 0, nil, 'bar', 7, 'baz', nil] arr.compact #=> ['foo', 0, 'bar', 7, 'baz'] arr #=> ['foo', 0, nil, 'bar', 7, 'baz', nil] arr.compact! #=> ['foo', 0, 'bar', 7, 'baz'] arr #=> ['foo', 0, 'bar', 7, 'baz']
Ein weiterer häufiger Bedarf ist das Entfernen von Duplikaten aus einem Array.
Es gibt das nicht-destruktive uniq und die destruktive Methode uniq!.
arr = [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556] arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123]
Iteration über ein Array
Wie alle Klassen, die das Enumerable-Modul einbinden, hat die Klasse Array eine `each`-Methode, die definiert, über welche Elemente und wie iteriert werden soll. Im Fall von Array#each werden alle Elemente von self nacheinander an den übergebenen Block übergeben.
Beachten Sie, dass diese Operation das Array unverändert lässt.
arr = [1, 2, 3, 4, 5] arr.each {|a| print a -= 10, " "} # prints: -9 -8 -7 -6 -5 #=> [1, 2, 3, 4, 5]
Ein weiterer manchmal nützlicher Iterator ist reverse_each, der die Elemente des Arrays in umgekehrter Reihenfolge durchläuft.
words = %w[first second third fourth fifth sixth] str = "" words.reverse_each {|word| str += "#{word} "} p str #=> "sixth fifth fourth third second first "
Die Methode map kann verwendet werden, um ein neues Array basierend auf dem ursprünglichen Array zu erstellen, wobei die Werte jedoch durch den übergebenen Block modifiziert werden.
arr.map {|a| 2*a} #=> [2, 4, 6, 8, 10] arr #=> [1, 2, 3, 4, 5] arr.map! {|a| a**2} #=> [1, 4, 9, 16, 25] arr #=> [1, 4, 9, 16, 25]
Elemente aus einem Array auswählen
Elemente können aus einem Array basierend auf Kriterien, die in einem Block definiert sind, ausgewählt werden. Die Auswahl kann destruktiv oder nicht-destruktiv erfolgen. Während die destruktiven Operationen das Array, auf dem sie aufgerufen wurden, ändern, geben die nicht-destruktiven Methoden normalerweise ein neues Array mit den ausgewählten Elementen zurück, lassen das ursprüngliche Array aber unverändert.
Nicht-destruktive Auswahl
arr = [1, 2, 3, 4, 5, 6] arr.select {|a| a > 3} #=> [4, 5, 6] arr.reject {|a| a < 3} #=> [3, 4, 5, 6] arr.drop_while {|a| a < 4} #=> [4, 5, 6] arr #=> [1, 2, 3, 4, 5, 6]
Destruktive Auswahl
select! und reject! sind die entsprechenden destruktiven Methoden zu select und reject.
Ähnlich wie bei select vs. reject haben delete_if und keep_if bei gleichem Block das exakt entgegengesetzte Ergebnis.
arr.delete_if {|a| a < 4} #=> [4, 5, 6] arr #=> [4, 5, 6] arr = [1, 2, 3, 4, 5, 6] arr.keep_if {|a| a < 4} #=> [1, 2, 3] arr #=> [1, 2, 3]
Was gibt es hier
Zuerst, was anderswo ist. Klasse Array
-
Erbt von Klasse Object.
-
Beinhaltet das Modul Enumerable, das Dutzende zusätzlicher Methoden bereitstellt.
Hier bietet die Klasse Array Methoden, die nützlich sind für:
Methoden zur Erstellung eines Arrays
-
::[]: Gibt ein neues Array zurück, das mit den angegebenen Objekten gefüllt ist. -
::new: Gibt ein neues Array zurück. -
::try_convert: Gibt ein neues Array zurück, das aus einem gegebenen Objekt erstellt wurde.
Siehe auch Arrays erstellen.
Methoden zum Abfragen
-
all?: Gibt zurück, ob alle Elemente ein gegebenes Kriterium erfüllen. -
any?: Gibt zurück, ob ein Element ein gegebenes Kriterium erfüllt. -
count: Gibt die Anzahl der Elemente zurück, die ein gegebenes Kriterium erfüllen. -
empty?: Gibt zurück, ob keine Elemente vorhanden sind. -
find_index(aliased asindex): Gibt den Index des ersten Elements zurück, das ein gegebenes Kriterium erfüllt. -
hash: Gibt den ganzzahligen Hash-Code zurück. -
include?: Gibt zurück, ob ein Element==einem gegebenen Objekt ist. -
length(aliased assize): Gibt die Anzahl der Elemente zurück. -
none?: Gibt zurück, ob kein Element==einem gegebenen Objekt ist. -
one?: Gibt zurück, ob genau ein Element==einem gegebenen Objekt ist. -
rindex: Gibt den Index des letzten Elements zurück, das ein gegebenes Kriterium erfüllt.
Methoden zum Vergleichen
-
<=>: Gibt -1, 0 oder 1 zurück, je nachdem, obselfkleiner, gleich oder größer als ein gegebenes Objekt ist. -
==: Gibt zurück, ob jedes Element inself==dem entsprechenden Element in einem gegebenen Objekt ist. -
eql?: Gibt zurück, ob jedes Element inselfeql?dem entsprechenden Element in einem gegebenen Objekt ist.
Methoden zum Abrufen
Diese Methoden ändern self nicht.
-
[](aliased asslice): Gibt aufeinanderfolgende Elemente zurück, wie durch ein gegebenes Argument bestimmt. -
assoc: Gibt das erste Element zurück, das ein Array ist, dessen erstes Element==einem gegebenen Objekt ist. -
at: Gibt das Element am gegebenen Offset zurück. -
bsearch: Gibt ein Element zurück, das mittels binärer Suche gemäß einem gegebenen Block ausgewählt wurde. -
bsearch_index: Gibt den Index eines Elements zurück, das mittels binärer Suche gemäß einem gegebenen Block ausgewählt wurde. -
compact: Gibt ein Array zurück, das alle Nicht-nil-Elemente enthält. -
dig: Gibt das Objekt in verschachtelten Objekten zurück, das durch einen gegebenen Index und zusätzliche Argumente spezifiziert ist. -
drop: Gibt nachfolgende Elemente zurück, wie durch einen gegebenen Index bestimmt. -
drop_while: Gibt nachfolgende Elemente zurück, wie durch einen gegebenen Block bestimmt. -
fetch: Gibt das Element am gegebenen Offset zurück. -
fetch_values: Gibt Elemente an gegebenen Offsets zurück. -
first: Gibt eines oder mehrere führende Elemente zurück. -
last: Gibt eines oder mehrere nachfolgende Elemente zurück. -
max: Gibt ein oder mehrere Elemente mit dem Maximalwert zurück, bestimmt durch<=>oder einen gegebenen Block. -
min: Gibt ein oder mehrere Elemente mit dem Minimalwert zurück, bestimmt durch<=>oder einen gegebenen Block. -
minmax: Gibt die Elemente mit dem minimalen und maximalen Wert zurück, bestimmt durch<=>oder einen gegebenen Block. -
rassoc: Gibt das erste Element zurück, das ein Array ist, dessen zweites Element==einem gegebenen Objekt ist. -
reject: Gibt ein Array zurück, das Elemente enthält, die von einem gegebenen Block nicht abgelehnt wurden. -
reverse: Gibt alle Elemente in umgekehrter Reihenfolge zurück. -
rotate: Gibt alle Elemente zurück, wobei einige von einem Ende zum anderen gedreht wurden. -
sample: Gibt ein oder mehrere zufällige Elemente zurück. -
select(aliased asfilter): Gibt ein Array zurück, das Elemente enthält, die von einem gegebenen Block ausgewählt wurden. -
shuffle: Gibt Elemente in zufälliger Reihenfolge zurück. -
sort: Gibt alle Elemente in einer Reihenfolge zurück, die durch<=>oder einen gegebenen Block bestimmt wird. -
take: Gibt führende Elemente zurück, wie durch einen gegebenen Index bestimmt. -
take_while: Gibt führende Elemente zurück, wie durch einen gegebenen Block bestimmt. -
uniq: Gibt ein Array zurück, das keine doppelten Elemente enthält. -
values_at: Gibt die Elemente an gegebenen Offsets zurück.
Methoden zum Zuweisen
Diese Methoden fügen Elemente hinzu, ersetzen oder ordnen sie in self neu.
-
<<: Fügt ein Element an. -
[]=: Weist angegebene Elemente mit einem gegebenen Objekt zu. -
concat: Fügt alle Elemente aus den gegebenen Arrays an. -
fill: Ersetzt angegebene Elemente durch angegebene Objekte. -
flatten!: Ersetzt jedes verschachtelte Array inselfdurch die Elemente aus diesem Array. -
initialize_copy(aliased asreplace): Ersetzt den Inhalt vonselfdurch den Inhalt eines gegebenen Arrays. -
insert: Fügt gegebene Objekte an einem gegebenen Offset ein; ersetzt keine Elemente. -
reverse!: Ersetztselfdurch seine Elemente in umgekehrter Reihenfolge. -
rotate!: Ersetztselfdurch seine Elemente in gedrehter Reihenfolge. -
shuffle!: Ersetztselfdurch seine Elemente in zufälliger Reihenfolge. -
sort!: Ersetztselfdurch seine sortierten Elemente, bestimmt durch<=>oder einen gegebenen Block. -
sort_by!: Ersetztselfdurch seine sortierten Elemente, bestimmt durch einen gegebenen Block.
Methoden zum Löschen
Jede dieser Methoden entfernt Elemente aus self.
-
clear: Entfernt alle Elemente. -
compact!: Entfernt allenil-Elemente. -
delete: Entfernt Elemente, die einem gegebenen Objekt gleich sind. -
delete_at: Entfernt das Element an einem gegebenen Offset. -
delete_if: Entfernt Elemente, die durch einen gegebenen Block spezifiziert sind. -
keep_if: Entfernt Elemente, die nicht durch einen gegebenen Block spezifiziert sind. -
pop: Entfernt und gibt das letzte Element zurück. -
reject!: Entfernt Elemente, die durch einen gegebenen Block spezifiziert sind. -
select!(aliased asfilter!): Entfernt Elemente, die nicht durch einen gegebenen Block spezifiziert sind. -
shift: Entfernt und gibt das erste Element zurück. -
slice!: Entfernt und gibt eine Sequenz von Elementen zurück. -
uniq!: Entfernt Duplikate.
Methoden zum Kombinieren
-
&: Gibt ein Array zurück, das Elemente enthält, die sowohl inselfals auch in einem gegebenen Array gefunden wurden. -
+: Gibt ein Array zurück, das alle Elemente vonselfgefolgt von allen Elementen eines gegebenen Arrays enthält. -
-: Gibt ein Array zurück, das alle Elemente vonselfenthält, die nicht in einem gegebenen Array gefunden wurden. -
|: Gibt ein Array zurück, das alle Elemente vonselfund alle Elemente eines gegebenen Arrays enthält, Duplikate entfernt. -
difference: Gibt ein Array zurück, das alle Elemente vonselfenthält, die in keinem der gegebenen Arrays gefunden wurden. -
intersection: Gibt ein Array zurück, das Elemente enthält, die sowohl inselfals auch in jedem gegebenen Array gefunden wurden. -
product: Gibt alle Kombinationen von Elementen ausselfund gegebenen Arrays zurück oder liefert sie. -
reverse: Gibt ein Array zurück, das alle Elemente vonselfin umgekehrter Reihenfolge enthält. -
union: Gibt ein Array zurück, das alle Elemente vonselfund alle Elemente von gegebenen Arrays enthält, Duplikate entfernt.
Methoden zur Iteration
-
combination: Ruft einen gegebenen Block mit Kombinationen von Elementen vonselfauf; eine Kombination verwendet dasselbe Element nicht mehr als einmal. -
cycle: Ruft einen gegebenen Block mit jedem Element auf, wiederholt dies dann für eine bestimmte Anzahl von Malen oder für immer. -
each: Übergibt jedes Element an einen gegebenen Block. -
each_index: Übergibt jeden Elementindex an einen gegebenen Block. -
permutation: Ruft einen gegebenen Block mit Permutationen von Elementen vonselfauf; eine Permutation verwendet dasselbe Element nicht mehr als einmal. -
repeated_combination: Ruft einen gegebenen Block mit Kombinationen von Elementen vonselfauf; eine Kombination kann dasselbe Element mehrmals verwenden. -
repeated_permutation: Ruft einen gegebenen Block mit Permutationen von Elementen vonselfauf; eine Permutation kann dasselbe Element mehrmals verwenden. -
reverse_each: Übergibt jedes Element in umgekehrter Reihenfolge an einen gegebenen Block.
Methoden zur Konvertierung
-
collect(aliased asmap): Gibt ein Array zurück, das den Rückgabewert des Blocks für jedes Element enthält. -
collect!(aliased asmap!): Ersetzt jedes Element durch einen Rückgabewert des Blocks. -
flatten: Gibt ein Array zurück, das eine rekursive Abflachung vonselfist. -
inspect(aliased asto_s): Gibt einen neuenStringzurück, der die Elemente enthält. -
join: Gibt einen neuenStringzurück, der die Elemente enthält, die durch den Feldseparator verbunden sind. -
to_a: Gibtselfoder ein neues Array zurück, das alle Elemente enthält. -
to_ary: Gibtselfzurück. -
to_h: Gibt einen neuen Hash zurück, der aus den Elementen gebildet wurde. -
transpose: Transponiertself, was ein Array von Arrays sein muss. -
zip: Gibt ein neues Array von Arrays zurück, dasselfund gegebene Arrays enthält.
Andere Methoden
-
*: Gibt eines der folgenden zurück:-
Mit einem Ganzzahlargument
nein neues Array, das die Verkettung vonnKopien vonselfist. -
Mit einem String-Argument
field_separatorein neuer String, der mitjoin(field_separator)äquivalent ist.
-
-
pack: Packt die Elemente in eine binäre Sequenz. -
sum: Gibt eine Summe von Elementen zurück, basierend auf entweder+oder einem gegebenen Block.
Öffentliche Klassenmethoden
Source
static VALUE
rb_ary_s_create(int argc, VALUE *argv, VALUE klass)
{
VALUE ary = ary_new(klass, argc);
if (argc > 0 && argv) {
ary_memcpy(ary, 0, argc, argv);
ARY_SET_LEN(ary, argc);
}
return ary;
}
Gibt ein neues Array zurück, das mit den angegebenen Objekten gefüllt ist.
Array[1, 'a', /^A/] # => [1, "a", /^A/] Array[] # => [] Array.[](1, 'a', /^A/) # => [1, "a", /^A/]
Zugehörig: siehe Methoden zur Erstellung eines Arrays.
Source
static VALUE
rb_ary_initialize(int argc, VALUE *argv, VALUE ary)
{
long len;
VALUE size, val;
rb_ary_modify(ary);
if (argc == 0) {
rb_ary_reset(ary);
RUBY_ASSERT(ARY_EMBED_P(ary));
RUBY_ASSERT(ARY_EMBED_LEN(ary) == 0);
if (rb_block_given_p()) {
rb_warning("given block not used");
}
return ary;
}
rb_scan_args(argc, argv, "02", &size, &val);
if (argc == 1 && !FIXNUM_P(size)) {
val = rb_check_array_type(size);
if (!NIL_P(val)) {
rb_ary_replace(ary, val);
return ary;
}
}
len = NUM2LONG(size);
/* NUM2LONG() may call size.to_int, ary can be frozen, modified, etc */
if (len < 0) {
rb_raise(rb_eArgError, "negative array size");
}
if (len > ARY_MAX_SIZE) {
rb_raise(rb_eArgError, "array size too big");
}
/* recheck after argument conversion */
rb_ary_modify(ary);
ary_resize_capa(ary, len);
if (rb_block_given_p()) {
long i;
if (argc == 2) {
rb_warn("block supersedes default value argument");
}
for (i=0; i<len; i++) {
rb_ary_store(ary, i, rb_yield(LONG2NUM(i)));
ARY_SET_LEN(ary, i + 1);
}
}
else {
ary_memfill(ary, 0, len, val);
ARY_SET_LEN(ary, len);
}
return ary;
}
Gibt ein neues Array zurück.
Ohne Block und ohne Argument wird ein neues leeres Array zurückgegeben.
Array.new # => []
Ohne Block und mit Array-Argument wird ein neues Array mit denselben Elementen zurückgegeben.
Array.new([:foo, 'bar', 2]) # => [:foo, "bar", 2]
Ohne Block und mit Ganzzahlargument wird ein neues Array zurückgegeben, das so viele Instanzen des gegebenen default_value enthält.
Array.new(0) # => [] Array.new(3) # => [nil, nil, nil] Array.new(2, 3) # => [3, 3]
Mit einem Block wird ein Array der angegebenen size zurückgegeben; der Block wird mit jedem index im Bereich (0...size) aufgerufen; das Element an diesem index im zurückgegebenen Array ist der Rückgabewert des Blocks.
Array.new(3) {|index| "Element #{index}" } # => ["Element 0", "Element 1", "Element 2"]
Ein häufiger Fallstrick für neue Rubyisten ist die Angabe eines Ausdrucks als default_value.
array = Array.new(2, {}) array # => [{}, {}] array[0][:a] = 1 array # => [{a: 1}, {a: 1}], as array[0] and array[1] are same object
Wenn Sie möchten, dass die Elemente des Arrays eindeutig sind, sollten Sie einen Block übergeben.
array = Array.new(2) { {} } array # => [{}, {}] array[0][:a] = 1 array # => [{a: 1}, {}], as array[0] and array[1] are different objects
Löst TypeError aus, wenn das erste Argument kein Array und kein integer-konvertierbares Objekt ist. Löst ArgumentError aus, wenn das erste Argument eine negative Ganzzahl ist.
Zugehörig: siehe Methoden zur Erstellung eines Arrays.
Source
static VALUE
rb_ary_s_try_convert(VALUE dummy, VALUE ary)
{
return rb_check_array_type(ary);
}
Versucht, ein Array zurückzugeben, basierend auf dem gegebenen object.
Wenn object ein Array ist, wird object zurückgegeben.
Andernfalls, wenn object auf :to_ary reagiert. Ruft object.to_ary auf: Wenn der Rückgabewert ein Array oder nil ist, wird dieser Wert zurückgegeben; wenn nicht, wird TypeError ausgelöst.
Andernfalls wird nil zurückgegeben.
Zugehörig: siehe Methoden zur Erstellung eines Arrays.
Öffentliche Instanzmethoden
Source
static VALUE
rb_ary_and(VALUE ary1, VALUE ary2)
{
VALUE hash, ary3, v;
st_data_t vv;
long i;
ary2 = to_ary(ary2);
ary3 = rb_ary_new();
if (RARRAY_LEN(ary1) == 0 || RARRAY_LEN(ary2) == 0) return ary3;
if (RARRAY_LEN(ary1) <= SMALL_ARRAY_LEN && RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
for (i=0; i<RARRAY_LEN(ary1); i++) {
v = RARRAY_AREF(ary1, i);
if (!rb_ary_includes_by_eql(ary2, v)) continue;
if (rb_ary_includes_by_eql(ary3, v)) continue;
rb_ary_push(ary3, v);
}
return ary3;
}
hash = ary_make_hash(ary2);
for (i=0; i<RARRAY_LEN(ary1); i++) {
v = RARRAY_AREF(ary1, i);
vv = (st_data_t)v;
if (rb_hash_stlike_delete(hash, &vv, 0)) {
rb_ary_push(ary3, v);
}
}
return ary3;
}
Gibt ein neues Array zurück, das die Schnittmenge von self und other_array enthält; das heißt, es enthält die Elemente, die sowohl in self als auch in other_array gefunden wurden.
[0, 1, 2, 3] & [1, 2] # => [1, 2]
Lässt Duplikate weg.
[0, 1, 1, 0] & [0, 1] # => [0, 1]
Bewahrt die Reihenfolge von self.
[0, 1, 2] & [3, 2, 1, 0] # => [0, 1, 2]
Identifiziert gemeinsame Elemente mithilfe der Methode eql? (wie in jedem Element von self definiert).
Zugehörig: siehe Methoden zum Kombinieren.
Source
static VALUE
rb_ary_times(VALUE ary, VALUE times)
{
VALUE ary2, tmp;
const VALUE *ptr;
long t, len;
tmp = rb_check_string_type(times);
if (!NIL_P(tmp)) {
return rb_ary_join(ary, tmp);
}
len = NUM2LONG(times);
if (len == 0) {
ary2 = ary_new(rb_cArray, 0);
goto out;
}
if (len < 0) {
rb_raise(rb_eArgError, "negative argument");
}
if (ARY_MAX_SIZE/len < RARRAY_LEN(ary)) {
rb_raise(rb_eArgError, "argument too big");
}
len *= RARRAY_LEN(ary);
ary2 = ary_new(rb_cArray, len);
ARY_SET_LEN(ary2, len);
ptr = RARRAY_CONST_PTR(ary);
t = RARRAY_LEN(ary);
if (0 < t) {
ary_memcpy(ary2, 0, t, ptr);
while (t <= len/2) {
ary_memcpy(ary2, t, t, RARRAY_CONST_PTR(ary2));
t *= 2;
}
if (t < len) {
ary_memcpy(ary2, t, len-t, RARRAY_CONST_PTR(ary2));
}
}
out:
return ary2;
}
Wenn ein nicht-negatives Ganzzahlargument n angegeben wird, wird ein neues Array zurückgegeben, das durch Verkettung von n Kopien von self erstellt wurde.
a = ['x', 'y'] a * 3 # => ["x", "y", "x", "y", "x", "y"]
Wenn ein String-Argument string_separator angegeben wird, ist dies äquivalent zu self.join(string_separator).
[0, [0, 1], {foo: 0}] * ', ' # => "0, 0, 1, {foo: 0}"
Source
VALUE
rb_ary_plus(VALUE x, VALUE y)
{
VALUE z;
long len, xlen, ylen;
y = to_ary(y);
xlen = RARRAY_LEN(x);
ylen = RARRAY_LEN(y);
len = xlen + ylen;
z = rb_ary_new2(len);
ary_memcpy(z, 0, xlen, RARRAY_CONST_PTR(x));
ary_memcpy(z, xlen, ylen, RARRAY_CONST_PTR(y));
ARY_SET_LEN(z, len);
return z;
}
Gibt ein neues Array zurück, das alle Elemente von self gefolgt von allen Elementen von other_array enthält.
a = [0, 1] + [2, 3] a # => [0, 1, 2, 3]
Zugehörig: siehe Methoden zum Kombinieren.
Source
VALUE
rb_ary_diff(VALUE ary1, VALUE ary2)
{
VALUE ary3;
VALUE hash;
long i;
ary2 = to_ary(ary2);
if (RARRAY_LEN(ary2) == 0) { return ary_make_shared_copy(ary1); }
ary3 = rb_ary_new();
if (RARRAY_LEN(ary1) <= SMALL_ARRAY_LEN || RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
for (i=0; i<RARRAY_LEN(ary1); i++) {
VALUE elt = rb_ary_elt(ary1, i);
if (rb_ary_includes_by_eql(ary2, elt)) continue;
rb_ary_push(ary3, elt);
}
return ary3;
}
hash = ary_make_hash(ary2);
for (i=0; i<RARRAY_LEN(ary1); i++) {
if (rb_hash_stlike_lookup(hash, RARRAY_AREF(ary1, i), NULL)) continue;
rb_ary_push(ary3, rb_ary_elt(ary1, i));
}
return ary3;
}
Gibt ein neues Array zurück, das nur die Elemente von self enthält, die nicht in other_array gefunden wurden; die Reihenfolge von self wird beibehalten.
[0, 1, 1, 2, 1, 1, 3, 1, 1] - [1] # => [0, 2, 3] [0, 1, 1, 2, 1, 1, 3, 1, 1] - [3, 2, 0, :foo] # => [1, 1, 1, 1, 1, 1] [0, 1, 2] - [:foo] # => [0, 1, 2]
Elemente werden mithilfe der Methode eql? verglichen (wie in jedem Element von self definiert).
Zugehörig: siehe Methoden zum Kombinieren.
Source
VALUE
rb_ary_push(VALUE ary, VALUE item)
{
long idx = RARRAY_LEN((ary_verify(ary), ary));
VALUE target_ary = ary_ensure_room_for_push(ary, 1);
RARRAY_PTR_USE(ary, ptr, {
RB_OBJ_WRITE(target_ary, &ptr[idx], item);
});
ARY_SET_LEN(ary, idx + 1);
ary_verify(ary);
return ary;
}
Fügt object als letztes Element in self an; gibt self zurück.
[:foo, 'bar', 2] << :baz # => [:foo, "bar", 2, :baz]
Fügt object als einzelnes Element an, auch wenn es sich um ein anderes Array handelt.
[:foo, 'bar', 2] << [3, 4] # => [:foo, "bar", 2, [3, 4]]
Zugehörig: siehe Methoden zum Zuweisen.
Source
VALUE
rb_ary_cmp(VALUE ary1, VALUE ary2)
{
long len;
VALUE v;
ary2 = rb_check_array_type(ary2);
if (NIL_P(ary2)) return Qnil;
if (ary1 == ary2) return INT2FIX(0);
v = rb_exec_recursive_paired(recursive_cmp, ary1, ary2, ary2);
if (!UNDEF_P(v)) return v;
len = RARRAY_LEN(ary1) - RARRAY_LEN(ary2);
if (len == 0) return INT2FIX(0);
if (len > 0) return INT2FIX(1);
return INT2FIX(-1);
}
Gibt -1, 0 oder 1 zurück, je nachdem, ob self als kleiner, gleich oder größer als other_array bestimmt wird.
Iteriert über jeden Index i in (0...self.size).
-
Berechnet
result[i]alsself[i] <=> other_array[i]. -
Gibt sofort 1 zurück, wenn
result[i]1 ist.[0, 1, 2] <=> [0, 0, 2] # => 1
-
Gibt sofort -1 zurück, wenn
result[i]-1 ist.[0, 1, 2] <=> [0, 2, 2] # => -1
-
Setzt fort, wenn
result[i]0 ist.
Wenn alle result 0 sind, wird self.size <=> other_array.size zurückgegeben (siehe Integer#<=>).
[0, 1, 2] <=> [0, 1] # => 1 [0, 1, 2] <=> [0, 1, 2] # => 0 [0, 1, 2] <=> [0, 1, 2, 3] # => -1
Beachten Sie, dass, wenn other_array größer als self ist, seine nachfolgenden Elemente das Ergebnis nicht beeinflussen.
[0, 1, 2] <=> [0, 1, 2, -3] # => -1 [0, 1, 2] <=> [0, 1, 2, 0] # => -1 [0, 1, 2] <=> [0, 1, 2, 3] # => -1
Zugehörig: siehe Methoden zum Vergleichen.
Source
static VALUE
rb_ary_equal(VALUE ary1, VALUE ary2)
{
if (ary1 == ary2) return Qtrue;
if (!RB_TYPE_P(ary2, T_ARRAY)) {
if (!rb_respond_to(ary2, idTo_ary)) {
return Qfalse;
}
return rb_equal(ary2, ary1);
}
if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return Qfalse;
if (RARRAY_CONST_PTR(ary1) == RARRAY_CONST_PTR(ary2)) return Qtrue;
return rb_exec_recursive_paired(recursive_equal, ary1, ary2, ary2);
}
Gibt zurück, ob beide:
-
selfundother_arraydie gleiche Größe haben. -
Ihre entsprechenden Elemente gleich sind; das heißt, für jeden Index
iin(0...self.size)giltself[i] == other_array[i].
Beispiele
[:foo, 'bar', 2] == [:foo, 'bar', 2] # => true [:foo, 'bar', 2] == [:foo, 'bar', 2.0] # => true [:foo, 'bar', 2] == [:foo, 'bar'] # => false # Different sizes. [:foo, 'bar', 2] == [:foo, 'bar', 3] # => false # Different elements.
Diese Methode unterscheidet sich von der Methode Array#eql?, die Elemente mithilfe von Object#eql? vergleicht.
Zugehörig: siehe Methoden zum Vergleichen.
Source
VALUE
rb_ary_aref(int argc, const VALUE *argv, VALUE ary)
{
rb_check_arity(argc, 1, 2);
if (argc == 2) {
return rb_ary_aref2(ary, argv[0], argv[1]);
}
return rb_ary_aref1(ary, argv[0]);
}
Gibt Elemente aus self zurück; ändert self nicht.
Kurz gesagt:
a = [:foo, 'bar', 2] # Single argument index: returns one element. a[0] # => :foo # Zero-based index. a[-1] # => 2 # Negative index counts backwards from end. # Arguments start and length: returns an array. a[1, 2] # => ["bar", 2] a[-2, 2] # => ["bar", 2] # Negative start counts backwards from end. # Single argument range: returns an array. a[0..1] # => [:foo, "bar"] a[0..-2] # => [:foo, "bar"] # Negative range-begin counts backwards from end. a[-2..2] # => ["bar", 2] # Negative range-end counts backwards from end.
Wenn ein einzelnes Ganzzahlargument index gegeben wird, wird das Element am Offset index zurückgegeben.
a = [:foo, 'bar', 2] a[0] # => :foo a[2] # => 2 a # => [:foo, "bar", 2]
Wenn index negativ ist, zählt es vom Ende von self rückwärts.
a = [:foo, 'bar', 2] a[-1] # => 2 a[-2] # => "bar"
Wenn index außerhalb des Bereichs liegt, wird nil zurückgegeben.
Wenn zwei Integer-Argumente start und length gegeben werden, wird ein neues Array der Größe length mit aufeinanderfolgenden Elementen zurückgegeben, beginnend bei Offset start.
a = [:foo, 'bar', 2] a[0, 2] # => [:foo, "bar"] a[1, 2] # => ["bar", 2]
Wenn start + length größer als self.length ist, werden alle Elemente von Offset start bis zum Ende zurückgegeben.
a = [:foo, 'bar', 2] a[0, 4] # => [:foo, "bar", 2] a[1, 3] # => ["bar", 2] a[2, 2] # => [2]
Wenn start == self.size und length >= 0, wird ein neues leeres Array zurückgegeben.
Wenn length negativ ist, wird nil zurückgegeben.
Wenn ein einzelnes Range-Argument range gegeben wird, werden range.min als start oben und range.size als length oben behandelt.
a = [:foo, 'bar', 2] a[0..1] # => [:foo, "bar"] a[1..2] # => ["bar", 2]
Sonderfall: Wenn range.start == a.size, wird ein neues leeres Array zurückgegeben.
Wenn range.end negativ ist, wird der Endindex vom Ende berechnet.
a = [:foo, 'bar', 2] a[0..-1] # => [:foo, "bar", 2] a[0..-2] # => [:foo, "bar"] a[0..-3] # => [:foo]
Wenn range.start negativ ist, wird der Startindex vom Ende berechnet.
a = [:foo, 'bar', 2] a[-1..2] # => [2] a[-2..2] # => ["bar", 2] a[-3..2] # => [:foo, "bar", 2]
Wenn range.start größer als die Array-Größe ist, wird nil zurückgegeben.
a = [:foo, 'bar', 2] a[4..1] # => nil a[4..0] # => nil a[4..-1] # => nil
Wenn ein einzelnes Enumerator::ArithmeticSequence-Argument aseq gegeben wird, wird ein Array von Elementen zurückgegeben, die den vom Sequenz erzeugten Indizes entsprechen.
a = ['--', 'data1', '--', 'data2', '--', 'data3'] a[(1..).step(2)] # => ["data1", "data2", "data3"]
Im Gegensatz zum Slicing mit einem Bereich wirft es einen RangeError, wenn der Anfang oder das Ende der arithmetischen Sequenz größer als die Array-Größe ist.
a = ['--', 'data1', '--', 'data2', '--', 'data3'] a[(1..11).step(2)] # RangeError (((1..11).step(2)) out of range) a[(7..).step(2)] # RangeError (((7..).step(2)) out of range)
Wenn ein einzelnes Argument übergeben wird und dessen Typ nicht zu den aufgeführten gehört, wird versucht, es in einen Integer zu konvertieren. Wenn dies nicht möglich ist, wird ein Fehler ausgelöst.
a = [:foo, 'bar', 2] # Raises TypeError (no implicit conversion of Symbol into Integer): a[:foo]
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_aset(int argc, VALUE *argv, VALUE ary)
{
long offset, beg, len;
rb_check_arity(argc, 2, 3);
rb_ary_modify_check(ary);
if (argc == 3) {
beg = NUM2LONG(argv[0]);
len = NUM2LONG(argv[1]);
return ary_aset_by_rb_ary_splice(ary, beg, len, argv[2]);
}
if (FIXNUM_P(argv[0])) {
offset = FIX2LONG(argv[0]);
return ary_aset_by_rb_ary_store(ary, offset, argv[1]);
}
if (rb_range_beg_len(argv[0], &beg, &len, RARRAY_LEN(ary), 1)) {
/* check if idx is Range */
return ary_aset_by_rb_ary_splice(ary, beg, len, argv[1]);
}
offset = NUM2LONG(argv[0]);
return ary_aset_by_rb_ary_store(ary, offset, argv[1]);
}
Weist Elemente in self basierend auf dem gegebenen objekt zu; gibt objekt zurück.
Kurz gesagt:
a_orig = [:foo, 'bar', 2] # With argument index. a = a_orig.dup a[0] = 'foo' # => "foo" a # => ["foo", "bar", 2] a = a_orig.dup a[7] = 'foo' # => "foo" a # => [:foo, "bar", 2, nil, nil, nil, nil, "foo"] # With arguments start and length. a = a_orig.dup a[0, 2] = 'foo' # => "foo" a # => ["foo", 2] a = a_orig.dup a[6, 50] = 'foo' # => "foo" a # => [:foo, "bar", 2, nil, nil, nil, "foo"] # With argument range. a = a_orig.dup a[0..1] = 'foo' # => "foo" a # => ["foo", 2] a = a_orig.dup a[6..50] = 'foo' # => "foo" a # => [:foo, "bar", 2, nil, nil, nil, "foo"]
Wenn ein Integer-Argument index übergeben wird, wird objekt einem Element in self zugewiesen.
Wenn index nicht negativ ist, wird objekt dem Element am Offset index zugewiesen.
a = [:foo, 'bar', 2] a[0] = 'foo' # => "foo" a # => ["foo", "bar", 2]
Wenn index größer als self.length ist, wird das Array erweitert.
a = [:foo, 'bar', 2] a[7] = 'foo' # => "foo" a # => [:foo, "bar", 2, nil, nil, nil, nil, "foo"]
Wenn index negativ ist, wird vom Ende des Arrays rückwärts gezählt.
a = [:foo, 'bar', 2] a[-1] = 'two' # => "two" a # => [:foo, "bar", "two"]
Wenn Integer-Argumente start und länge übergeben werden und objekt kein Array ist, werden länge - 1 Elemente beginnend am Offset start entfernt und objekt am Offset start zugewiesen.
a = [:foo, 'bar', 2] a[0, 2] = 'foo' # => "foo" a # => ["foo", 2]
Wenn start negativ ist, wird vom Ende des Arrays rückwärts gezählt.
a = [:foo, 'bar', 2] a[-2, 2] = 'foo' # => "foo" a # => [:foo, "foo"]
Wenn start nicht negativ und außerhalb des Arrays liegt ( >= self.size), wird das Array mit nil erweitert, objekt wird am Offset start zugewiesen und länge wird ignoriert.
a = [:foo, 'bar', 2] a[6, 50] = 'foo' # => "foo" a # => [:foo, "bar", 2, nil, nil, nil, "foo"]
Wenn länge null ist, werden Elemente ab dem Offset start verschoben und objekt am Offset start zugewiesen.
a = [:foo, 'bar', 2] a[1, 0] = 'foo' # => "foo" a # => [:foo, "foo", "bar", 2]
Wenn länge zu groß für das bestehende Array ist, wird das Array nicht erweitert.
a = [:foo, 'bar', 2] a[1, 5] = 'foo' # => "foo" a # => [:foo, "foo"]
Wenn ein Range-Argument bereich übergeben wird und objekt kein Array ist, werden länge - 1 Elemente beginnend am Offset start entfernt und objekt am Offset start zugewiesen.
a = [:foo, 'bar', 2] a[0..1] = 'foo' # => "foo" a # => ["foo", 2]
Wenn range.begin negativ ist, wird vom Ende des Arrays rückwärts gezählt.
a = [:foo, 'bar', 2] a[-2..2] = 'foo' # => "foo" a # => [:foo, "foo"]
Wenn die Array-Länge kleiner als range.begin ist, wird das Array mit nil erweitert, objekt wird am Offset range.begin zugewiesen und länge wird ignoriert.
a = [:foo, 'bar', 2] a[6..50] = 'foo' # => "foo" a # => [:foo, "bar", 2, nil, nil, nil, "foo"]
Wenn range.end null ist, werden Elemente ab dem Offset start verschoben und objekt am Offset start zugewiesen.
a = [:foo, 'bar', 2] a[1..0] = 'foo' # => "foo" a # => [:foo, "foo", "bar", 2]
Wenn range.end negativ ist, wird objekt am Offset start zugewiesen, es werden range.end.abs -1 Elemente danach beibehalten und die darüber hinausgehenden entfernt.
a = [:foo, 'bar', 2] a[1..-1] = 'foo' # => "foo" a # => [:foo, "foo"] a = [:foo, 'bar', 2] a[1..-2] = 'foo' # => "foo" a # => [:foo, "foo", 2] a = [:foo, 'bar', 2] a[1..-3] = 'foo' # => "foo" a # => [:foo, "foo", "bar", 2] a = [:foo, 'bar', 2]
Wenn range.end zu groß für das bestehende Array ist, werden Array-Elemente ersetzt, aber das Array wird nicht mit nil-Werten erweitert.
a = [:foo, 'bar', 2] a[1..5] = 'foo' # => "foo" a # => [:foo, "foo"]
Zugehörig: siehe Methoden zum Zuweisen.
Source
static VALUE
rb_ary_or(VALUE ary1, VALUE ary2)
{
VALUE hash;
ary2 = to_ary(ary2);
if (RARRAY_LEN(ary1) + RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
VALUE ary3 = rb_ary_new();
rb_ary_union(ary3, ary1);
rb_ary_union(ary3, ary2);
return ary3;
}
hash = ary_make_hash(ary1);
rb_ary_union_hash(hash, ary2);
return rb_hash_values(hash);
}
Gibt die Vereinigung von self und other_array zurück; Duplikate werden entfernt; die Reihenfolge bleibt erhalten; Elemente werden mit eql? verglichen.
[0, 1] | [2, 3] # => [0, 1, 2, 3] [0, 1, 1] | [2, 2, 3] # => [0, 1, 2, 3] [0, 1, 2] | [3, 2, 1, 0] # => [0, 1, 2, 3]
Zugehörig: siehe Methoden zum Kombinieren.
Source
static VALUE
rb_ary_all_p(int argc, VALUE *argv, VALUE ary)
{
long i, len = RARRAY_LEN(ary);
rb_check_arity(argc, 0, 1);
if (!len) return Qtrue;
if (argc) {
if (rb_block_given_p()) {
rb_warn("given block not used");
}
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (!RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) return Qfalse;
}
}
else if (!rb_block_given_p()) {
for (i = 0; i < len; ++i) {
if (!RTEST(RARRAY_AREF(ary, i))) return Qfalse;
}
}
else {
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (!RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qfalse;
}
}
return Qtrue;
}
Gibt zurück, ob für jedes Element von self eine gegebene Bedingung erfüllt ist.
Ohne Block und ohne Argument wird zurückgegeben, ob jedes Element von self wahrheitsgemäß ist.
[[], {}, '', 0, 0.0, Object.new].all? # => true # All truthy objects.
[[], {}, '', 0, 0.0, nil].all? # => false # nil is not truthy.
[[], {}, '', 0, 0.0, false].all? # => false # false is not truthy.
Mit dem Argument objekt wird zurückgegeben, ob objekt === ele für jedes Element ele in self gilt.
[0, 0, 0].all?(0) # => true [0, 1, 2].all?(1) # => false ['food', 'fool', 'foot'].all?(/foo/) # => true ['food', 'drink'].all?(/foo/) # => false
Mit einem Block wird der Block mit jedem Element in self aufgerufen; es wird zurückgegeben, ob der Block nur wahrheitsgemäße Werte zurückgibt.
[0, 1, 2].all? { |ele| ele < 3 } # => true [0, 1, 2].all? { |ele| ele < 2 } # => false
Mit einem Block und einem Argument objekt wird der Block ignoriert und objekt wie oben verwendet.
Sonderfall: gibt true zurück, wenn self leer ist (unabhängig von übergebenen Argumenten oder Blöcken).
Zugehörig: siehe Methoden zur Abfrage.
Source
static VALUE
rb_ary_any_p(int argc, VALUE *argv, VALUE ary)
{
long i, len = RARRAY_LEN(ary);
rb_check_arity(argc, 0, 1);
if (!len) return Qfalse;
if (argc) {
if (rb_block_given_p()) {
rb_warn("given block not used");
}
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) return Qtrue;
}
}
else if (!rb_block_given_p()) {
for (i = 0; i < len; ++i) {
if (RTEST(RARRAY_AREF(ary, i))) return Qtrue;
}
}
else {
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qtrue;
}
}
return Qfalse;
}
Gibt zurück, ob für irgendein Element von self eine gegebene Bedingung erfüllt ist.
Ohne Block und ohne Argument wird zurückgegeben, ob irgendein Element von self wahrheitsgemäß ist.
[nil, false, []].any? # => true # Array object is truthy. [nil, false, {}].any? # => true # Hash object is truthy. [nil, false, ''].any? # => true # String object is truthy. [nil, false].any? # => false # Nil and false are not truthy.
Mit dem Argument objekt wird zurückgegeben, ob objekt === ele für irgendein Element ele in self gilt.
[nil, false, 0].any?(0) # => true [nil, false, 1].any?(0) # => false [nil, false, 'food'].any?(/foo/) # => true [nil, false, 'food'].any?(/bar/) # => false
Mit einem Block wird der Block mit jedem Element in self aufgerufen; es wird zurückgegeben, ob der Block irgendeinen wahrheitsgemäßen Wert zurückgibt.
[0, 1, 2].any? {|ele| ele < 1 } # => true [0, 1, 2].any? {|ele| ele < 0 } # => false
Mit einem Block und einem Argument objekt wird der Block ignoriert und objekt wie oben verwendet.
Sonderfall: gibt false zurück, wenn self leer ist (unabhängig von übergebenen Argumenten oder Blöcken).
Zugehörig: siehe Methoden zur Abfrage.
Hängt jedes Argument in objekte an self an; gibt self zurück.
a = [:foo, 'bar', 2] # => [:foo, "bar", 2] a.push(:baz, :bat) # => [:foo, "bar", 2, :baz, :bat]
Hängt jedes Argument als einzelnes Element an, auch wenn es ein anderes Array ist.
a = [:foo, 'bar', 2] # => [:foo, "bar", 2] a.push([:baz, :bat], [:bam, :bad]) # => [:foo, "bar", 2, [:baz, :bat], [:bam, :bad]]
Zugehörig: siehe Methoden zum Zuweisen.
Source
VALUE
rb_ary_assoc(VALUE ary, VALUE key)
{
long i;
VALUE v;
for (i = 0; i < RARRAY_LEN(ary); ++i) {
v = rb_check_array_type(RARRAY_AREF(ary, i));
if (!NIL_P(v) && RARRAY_LEN(v) > 0 &&
rb_equal(RARRAY_AREF(v, 0), key))
return v;
}
return Qnil;
}
Gibt das erste Element ele in self zurück, so dass ele ein Array ist und ele[0] == objekt.
a = [{foo: 0}, [2, 4], [4, 5, 6], [4, 5]] a.assoc(4) # => [4, 5, 6]
Gibt nil zurück, wenn kein solches Element gefunden wurde.
Zugehörig: Array#rassoc; siehe auch Methoden zum Abrufen.
Source
VALUE
rb_ary_at(VALUE ary, VALUE pos)
{
return rb_ary_entry(ary, NUM2LONG(pos));
}
Gibt das Element von self zurück, das durch den gegebenen index spezifiziert wird, oder nil, wenn kein solches Element existiert; index muss ein integer-konvertierbares Objekt sein.
Für nicht-negative index wird das Element von self am Offset index zurückgegeben.
a = [:foo, 'bar', 2] a.at(0) # => :foo a.at(2) # => 2 a.at(2.0) # => 2
Für negative index wird vom Ende von self rückwärts gezählt.
a.at(-2) # => "bar"
Zugehörig: Array#[]; siehe auch Methoden zum Abrufen.
Source
static VALUE
rb_ary_bsearch(VALUE ary)
{
VALUE index_result = rb_ary_bsearch_index(ary);
if (FIXNUM_P(index_result)) {
return rb_ary_entry(ary, FIX2LONG(index_result));
}
return index_result;
}
Gibt das Element aus self zurück, das durch eine binäre Suche gefunden wurde, oder nil, wenn die Suche kein geeignetes Element gefunden hat.
Siehe Binäre Suche.
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_bsearch_index(VALUE ary)
{
long low = 0, high = RARRAY_LEN(ary), mid;
int smaller = 0, satisfied = 0;
VALUE v, val;
RETURN_ENUMERATOR(ary, 0, 0);
while (low < high) {
mid = low + ((high - low) / 2);
val = rb_ary_entry(ary, mid);
v = rb_yield(val);
if (FIXNUM_P(v)) {
if (v == INT2FIX(0)) return INT2FIX(mid);
smaller = (SIGNED_VALUE)v < 0; /* Fixnum preserves its sign-bit */
}
else if (v == Qtrue) {
satisfied = 1;
smaller = 1;
}
else if (!RTEST(v)) {
smaller = 0;
}
else if (rb_obj_is_kind_of(v, rb_cNumeric)) {
const VALUE zero = INT2FIX(0);
switch (rb_cmpint(rb_funcallv(v, id_cmp, 1, &zero), v, zero)) {
case 0: return INT2FIX(mid);
case 1: smaller = 0; break;
case -1: smaller = 1;
}
}
else {
rb_raise(rb_eTypeError, "wrong argument type %"PRIsVALUE
" (must be numeric, true, false or nil)",
rb_obj_class(v));
}
if (smaller) {
high = mid;
}
else {
low = mid + 1;
}
}
if (!satisfied) return Qnil;
return INT2FIX(low);
}
Gibt den ganzzahligen Index des Elements aus self zurück, das durch eine binäre Suche gefunden wurde, oder nil, wenn die Suche kein geeignetes Element gefunden hat.
Siehe Binäre Suche.
Zugehörig: siehe Methoden zum Abrufen.
Source
VALUE
rb_ary_clear(VALUE ary)
{
rb_ary_modify_check(ary);
if (ARY_SHARED_P(ary)) {
rb_ary_unshare(ary);
FL_SET_EMBED(ary);
ARY_SET_EMBED_LEN(ary, 0);
}
else {
ARY_SET_LEN(ary, 0);
if (ARY_DEFAULT_SIZE * 2 < ARY_CAPA(ary)) {
ary_resize_capa(ary, ARY_DEFAULT_SIZE * 2);
}
}
ary_verify(ary);
return ary;
}
Entfernt alle Elemente aus self; gibt self zurück.
a = [:foo, 'bar', 2] a.clear # => []
Zugehörig: siehe Methoden zum Löschen.
Source
static VALUE
rb_ary_collect(VALUE ary)
{
long i;
VALUE collect;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
collect = rb_ary_new2(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
rb_ary_push(collect, rb_yield(RARRAY_AREF(ary, i)));
}
return collect;
}
Mit einem Block wird der Block mit jedem Element von self aufgerufen; es wird ein neues Array zurückgegeben, dessen Elemente die Rückgabewerte des Blocks sind.
a = [:foo, 'bar', 2] a1 = a.map {|element| element.class } a1 # => [Symbol, String, Integer]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: collect!; siehe auch Methoden zur Konvertierung.
Source
static VALUE
rb_ary_collect_bang(VALUE ary)
{
long i;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
rb_ary_modify(ary);
for (i = 0; i < RARRAY_LEN(ary); i++) {
rb_ary_store(ary, i, rb_yield(RARRAY_AREF(ary, i)));
}
return ary;
}
Mit einem Block wird der Block mit jedem Element von self aufgerufen und das Element durch den Rückgabewert des Blocks ersetzt; gibt self zurück.
a = [:foo, 'bar', 2] a.map! { |element| element.class } # => [Symbol, String, Integer]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: collect; siehe auch Methoden zur Konvertierung.
Source
static VALUE
rb_ary_combination(VALUE ary, VALUE num)
{
long i, n, len;
n = NUM2LONG(num);
RETURN_SIZED_ENUMERATOR(ary, 1, &num, rb_ary_combination_size);
len = RARRAY_LEN(ary);
if (n < 0 || len < n) {
/* yield nothing */
}
else if (n == 0) {
rb_yield(rb_ary_new2(0));
}
else if (n == 1) {
for (i = 0; i < RARRAY_LEN(ary); i++) {
rb_yield(rb_ary_new3(1, RARRAY_AREF(ary, i)));
}
}
else {
VALUE ary0 = ary_make_shared_copy(ary); /* private defensive copy of ary */
volatile VALUE t0;
long *stack = ALLOCV_N(long, t0, n+1);
RBASIC_CLEAR_CLASS(ary0);
combinate0(len, n, stack, ary0);
ALLOCV_END(t0);
RBASIC_SET_CLASS_RAW(ary0, rb_cArray);
}
return ary;
}
Wenn ein Block und ein positives integer-konvertierbares Objekt anzahl (0 < anzahl <= self.size) übergeben werden, wird der Block mit jeder Kombination von self der Größe anzahl aufgerufen; gibt self zurück.
a = %w[a b c] # => ["a", "b", "c"] a.combination(2) {|combination| p combination } # => ["a", "b", "c"]
Ausgabe
["a", "b"] ["a", "c"] ["b", "c"]
Die Reihenfolge der übergebenen Kombinationen ist nicht garantiert.
Wenn anzahl null ist, wird der Block einmal mit einem neuen leeren Array aufgerufen.
a.combination(0) {|combination| p combination } [].combination(0) {|combination| p combination }
Ausgabe
[] []
Wenn anzahl negativ ist oder größer als self.size und self nicht leer ist, wird der Block nicht aufgerufen.
a.combination(-1) {|combination| fail 'Cannot happen' } # => ["a", "b", "c"] a.combination(4) {|combination| fail 'Cannot happen' } # => ["a", "b", "c"]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: Array#permutation; siehe auch Methoden zum Iterieren.
Source
static VALUE
rb_ary_compact(VALUE ary)
{
ary = rb_ary_dup(ary);
rb_ary_compact_bang(ary);
return ary;
}
Gibt ein neues Array zurück, das nur die Nicht-nil-Elemente von self enthält; die Elementreihenfolge bleibt erhalten.
a = [nil, 0, nil, false, nil, '', nil, [], nil, {}] a.compact # => [0, false, "", [], {}]
Zugehörig: Array#compact!; siehe auch Methoden zum Löschen.
Source
static VALUE
rb_ary_compact_bang(VALUE ary)
{
VALUE *p, *t, *end;
long n;
rb_ary_modify(ary);
p = t = (VALUE *)RARRAY_CONST_PTR(ary); /* WB: no new reference */
end = p + RARRAY_LEN(ary);
while (t < end) {
if (NIL_P(*t)) t++;
else *p++ = *t++;
}
n = p - RARRAY_CONST_PTR(ary);
if (RARRAY_LEN(ary) == n) {
return Qnil;
}
ary_resize_smaller(ary, n);
return ary;
}
Entfernt alle nil-Elemente aus self; gibt self zurück, wenn Elemente entfernt wurden, andernfalls nil.
a = [nil, 0, nil, false, nil, '', nil, [], nil, {}] a.compact! # => [0, false, "", [], {}] a # => [0, false, "", [], {}] a.compact! # => nil
Zugehörig: Array#compact; siehe auch Methoden zum Löschen.
Source
static VALUE
rb_ary_concat_multi(int argc, VALUE *argv, VALUE ary)
{
rb_ary_modify_check(ary);
if (argc == 1) {
rb_ary_concat(ary, argv[0]);
}
else if (argc > 1) {
int i;
VALUE args = rb_ary_hidden_new(argc);
for (i = 0; i < argc; i++) {
rb_ary_concat(args, argv[i]);
}
ary_append(ary, args);
}
ary_verify(ary);
return ary;
}
Fügt self alle Elemente aus jedem Array in andere_arrays hinzu; gibt self zurück.
a = [0, 1] a.concat(['two', 'three'], [:four, :five], a) # => [0, 1, "two", "three", :four, :five, 0, 1]
Zugehörig: siehe Methoden zum Zuweisen.
Source
static VALUE
rb_ary_count(int argc, VALUE *argv, VALUE ary)
{
long i, n = 0;
if (rb_check_arity(argc, 0, 1) == 0) {
VALUE v;
if (!rb_block_given_p())
return LONG2NUM(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
v = RARRAY_AREF(ary, i);
if (RTEST(rb_yield(v))) n++;
}
}
else {
VALUE obj = argv[0];
if (rb_block_given_p()) {
rb_warn("given block not used");
}
for (i = 0; i < RARRAY_LEN(ary); i++) {
if (rb_equal(RARRAY_AREF(ary, i), obj)) n++;
}
}
return LONG2NUM(n);
}
Gibt eine Anzahl von angegebenen Elementen zurück.
Ohne Argument und ohne Block wird die Anzahl aller Elemente zurückgegeben.
[0, :one, 'two', 3, 3.0].count # => 5
Mit dem Argument objekt wird die Anzahl der Elemente zurückgegeben, die == zu objekt sind.
[0, :one, 'two', 3, 3.0].count(3) # => 2
Ohne Argument und mit einem Block wird der Block mit jedem Element aufgerufen; es wird die Anzahl der Elemente zurückgegeben, für die der Block einen wahrheitsgemäßen Wert zurückgibt.
[0, 1, 2, 3].count {|element| element > 1 } # => 2
Mit dem Argument objekt und einem Block wird eine Warnung ausgegeben, der Block ignoriert und die Anzahl der Elemente zurückgegeben, die == zu objekt sind.
Zugehörig: siehe Methoden zur Abfrage.
Source
static VALUE
rb_ary_cycle(int argc, VALUE *argv, VALUE ary)
{
long n, i;
rb_check_arity(argc, 0, 1);
RETURN_SIZED_ENUMERATOR(ary, argc, argv, rb_ary_cycle_size);
if (argc == 0 || NIL_P(argv[0])) {
n = -1;
}
else {
n = NUM2LONG(argv[0]);
if (n <= 0) return Qnil;
}
while (RARRAY_LEN(ary) > 0 && (n < 0 || 0 < n--)) {
for (i=0; i<RARRAY_LEN(ary); i++) {
rb_yield(RARRAY_AREF(ary, i));
}
}
return Qnil;
}
Mit einem Block wird der Block möglicherweise aufgerufen, abhängig vom Wert des Arguments anzahl; anzahl muss ein integer-konvertierbares Objekt oder nil sein.
Wenn anzahl positiv ist, wird der Block mit jedem Element aufgerufen und dies wird wiederholt, bis es anzahl Mal geschehen ist; gibt nil zurück.
output = [] [0, 1].cycle(2) {|element| output.push(element) } # => nil output # => [0, 1, 0, 1]
Wenn anzahl null oder negativ ist, wird der Block nicht aufgerufen.
[0, 1].cycle(0) {|element| fail 'Cannot happen' } # => nil [0, 1].cycle(-1) {|element| fail 'Cannot happen' } # => nil
Wenn anzahl nil ist, wird unendlich zyklisiert.
# Prints 0 and 1 forever. [0, 1].cycle {|element| puts element } [0, 1].cycle(nil) {|element| puts element }
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Iterieren.
Source
VALUE
rb_ary_delete(VALUE ary, VALUE item)
{
VALUE v = item;
long i1, i2;
for (i1 = i2 = 0; i1 < RARRAY_LEN(ary); i1++) {
VALUE e = RARRAY_AREF(ary, i1);
if (rb_equal(e, item)) {
v = e;
continue;
}
if (i1 != i2) {
rb_ary_store(ary, i2, e);
}
i2++;
}
if (RARRAY_LEN(ary) == i2) {
if (rb_block_given_p()) {
return rb_yield(item);
}
return Qnil;
}
ary_resize_smaller(ary, i2);
ary_verify(ary);
return v;
}
Entfernt null oder mehr Elemente aus self.
Ohne Block werden aus self alle Elemente ele entfernt, für die ele == objekt gilt; das zuletzt entfernte Element wird zurückgegeben.
a = [0, 1, 2, 2.0] a.delete(2) # => 2.0 a # => [0, 1]
Gibt nil zurück, wenn keine Elemente entfernt wurden.
a.delete(2) # => nil
Mit einem Block werden aus self alle Elemente ele entfernt, für die ele == objekt gilt.
Wenn solche Elemente gefunden werden, wird der Block ignoriert und das zuletzt entfernte Element zurückgegeben.
a = [0, 1, 2, 2.0] a.delete(2) {|element| fail 'Cannot happen' } # => 2.0 a # => [0, 1]
Wenn kein solches Element gefunden wird, wird der Rückgabewert des Blocks zurückgegeben.
a.delete(2) {|element| "Element #{element} not found." } # => "Element 2 not found."
Zugehörig: siehe Methoden zum Löschen.
Source
static VALUE
rb_ary_delete_at_m(VALUE ary, VALUE pos)
{
return rb_ary_delete_at(ary, NUM2LONG(pos));
}
Entfernt das Element von self am gegebenen index, der ein integer-konvertierbares Objekt sein muss.
Wenn index nicht negativ ist, wird das Element am Offset index gelöscht.
a = [:foo, 'bar', 2] a.delete_at(1) # => "bar" a # => [:foo, 2]
Wenn index negativ ist, wird vom Ende des Arrays rückwärts gezählt.
a = [:foo, 'bar', 2] a.delete_at(-2) # => "bar" a # => [:foo, 2]
Wenn index außerhalb des Bereichs liegt, wird nil zurückgegeben.
a = [:foo, 'bar', 2] a.delete_at(3) # => nil a.delete_at(-4) # => nil
Zugehörig: siehe Methoden zum Löschen.
Source
static VALUE
rb_ary_delete_if(VALUE ary)
{
ary_verify(ary);
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
ary_reject_bang(ary);
return ary;
}
Mit einem Block wird der Block mit jedem Element von self aufgerufen; das Element wird gelöscht, wenn der Block einen wahrheitsgemäßen Wert zurückgibt; gibt self zurück.
a = [:foo, 'bar', 2, 'bat'] a.delete_if {|element| element.to_s.start_with?('b') } # => [:foo, 2]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Löschen.
Source
static VALUE
rb_ary_difference_multi(int argc, VALUE *argv, VALUE ary)
{
VALUE ary_diff;
long i, length;
volatile VALUE t0;
bool *is_hash = ALLOCV_N(bool, t0, argc);
ary_diff = rb_ary_new();
length = RARRAY_LEN(ary);
for (i = 0; i < argc; i++) {
argv[i] = to_ary(argv[i]);
is_hash[i] = (length > SMALL_ARRAY_LEN && RARRAY_LEN(argv[i]) > SMALL_ARRAY_LEN);
if (is_hash[i]) argv[i] = ary_make_hash(argv[i]);
}
for (i = 0; i < RARRAY_LEN(ary); i++) {
int j;
VALUE elt = rb_ary_elt(ary, i);
for (j = 0; j < argc; j++) {
if (is_hash[j]) {
if (rb_hash_stlike_lookup(argv[j], elt, NULL))
break;
}
else {
if (rb_ary_includes_by_eql(argv[j], elt)) break;
}
}
if (j == argc) rb_ary_push(ary_diff, elt);
}
ALLOCV_END(t0);
return ary_diff;
}
Gibt ein neues Array zurück, das nur die Elemente aus self enthält, die in keinem der gegebenen andere_arrays gefunden werden; Elemente werden mit eql? verglichen; die Reihenfolge aus self bleibt erhalten.
[0, 1, 1, 2, 1, 1, 3, 1, 1].difference([1]) # => [0, 2, 3] [0, 1, 2, 3].difference([3, 0], [1, 3]) # => [2] [0, 1, 2].difference([4]) # => [0, 1, 2] [0, 1, 2].difference # => [0, 1, 2]
Gibt eine Kopie von self zurück, wenn keine Argumente übergeben werden.
Zugehörig: Array#-; siehe auch Methoden zum Kombinieren.
Source
static VALUE
rb_ary_dig(int argc, VALUE *argv, VALUE self)
{
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
self = rb_ary_at(self, *argv);
if (!--argc) return self;
++argv;
return rb_obj_dig(argc, argv, self, Qnil);
}
Findet und gibt das Objekt in verschachtelten Objekten zurück, das durch index und identifikatoren spezifiziert wird; die verschachtelten Objekte können Instanzen verschiedener Klassen sein. Siehe Dig-Methoden.
Beispiele
a = [:foo, [:bar, :baz, [:bat, :bam]]] a.dig(1) # => [:bar, :baz, [:bat, :bam]] a.dig(1, 2) # => [:bat, :bam] a.dig(1, 2, 0) # => :bat a.dig(1, 2, 3) # => nil
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_drop(VALUE ary, VALUE n)
{
VALUE result;
long pos = NUM2LONG(n);
if (pos < 0) {
rb_raise(rb_eArgError, "attempt to drop negative size");
}
result = rb_ary_subseq(ary, pos, RARRAY_LEN(ary));
if (NIL_P(result)) result = rb_ary_new();
return result;
}
Gibt ein neues Array zurück, das alle außer den ersten anzahl Elementen von self enthält, wobei anzahl eine nicht-negative Ganzzahl ist; modifiziert self nicht.
Beispiele
a = [0, 1, 2, 3, 4, 5] a.drop(0) # => [0, 1, 2, 3, 4, 5] a.drop(1) # => [1, 2, 3, 4, 5] a.drop(2) # => [2, 3, 4, 5] a.drop(9) # => []
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_drop_while(VALUE ary)
{
long i;
RETURN_ENUMERATOR(ary, 0, 0);
for (i = 0; i < RARRAY_LEN(ary); i++) {
if (!RTEST(rb_yield(RARRAY_AREF(ary, i)))) break;
}
return rb_ary_drop(ary, LONG2FIX(i));
}
Mit einem Block wird der Block mit jedem aufeinanderfolgenden Element von self aufgerufen; stoppt, wenn der Block false oder nil zurückgibt; gibt ein neues Array zurück, das die Elemente weglässt, für die der Block einen wahrheitsgemäßen Wert zurückgegeben hat; modifiziert self nicht.
a = [0, 1, 2, 3, 4, 5] a.drop_while {|element| element < 3 } # => [3, 4, 5]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Abrufen.
Source
VALUE
rb_ary_each(VALUE ary)
{
long i;
ary_verify(ary);
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
for (i=0; i<RARRAY_LEN(ary); i++) {
rb_yield(RARRAY_AREF(ary, i));
}
return ary;
}
Mit einem Block wird über die Elemente von self iteriert, wobei jedes Element an den Block übergeben wird; gibt self zurück.
a = [:foo, 'bar', 2] a.each {|element| puts "#{element.class} #{element}" }
Ausgabe
Symbol foo String bar Integer 2
Ermöglicht die Änderung des Arrays während der Iteration.
a = [:foo, 'bar', 2] a.each {|element| puts element; a.clear if element.to_s.start_with?('b') }
Ausgabe
foo bar
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Iterieren.
Source
static VALUE
rb_ary_each_index(VALUE ary)
{
long i;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
for (i=0; i<RARRAY_LEN(ary); i++) {
rb_yield(LONG2NUM(i));
}
return ary;
}
Mit einem Block wird über die Elemente von self iteriert, wobei jeder *Array-Index* an den Block übergeben wird; gibt self zurück.
a = [:foo, 'bar', 2] a.each_index {|index| puts "#{index} #{a[index]}" }
Ausgabe
0 foo 1 bar 2 2
Ermöglicht die Änderung des Arrays während der Iteration.
a = [:foo, 'bar', 2] a.each_index {|index| puts index; a.clear if index > 0 } a # => []
Ausgabe
0 1
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Iterieren.
Source
static VALUE
rb_ary_empty_p(VALUE ary)
{
return RBOOL(RARRAY_LEN(ary) == 0);
}
Gibt true zurück, wenn die Anzahl der Elemente in self null ist, andernfalls false.
Zugehörig: siehe Methoden zur Abfrage.
Source
static VALUE
rb_ary_eql(VALUE ary1, VALUE ary2)
{
if (ary1 == ary2) return Qtrue;
if (!RB_TYPE_P(ary2, T_ARRAY)) return Qfalse;
if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return Qfalse;
if (RARRAY_CONST_PTR(ary1) == RARRAY_CONST_PTR(ary2)) return Qtrue;
return rb_exec_recursive_paired(recursive_eql, ary1, ary2, ary2);
}
Gibt true zurück, wenn self und anderes_array die gleiche Größe haben und wenn für jeden Index i in self gilt: self[i].eql?(anderes_array[i]).
a0 = [:foo, 'bar', 2] a1 = [:foo, 'bar', 2] a1.eql?(a0) # => true
Andernfalls gibt es false zurück.
Diese Methode unterscheidet sich von der Methode Array#==, die mit der Methode Object#== vergleicht.
Zugehörig: siehe Methoden zur Abfrage.
Source
static VALUE
rb_ary_fetch(int argc, VALUE *argv, VALUE ary)
{
VALUE pos, ifnone;
long block_given;
long idx;
rb_scan_args(argc, argv, "11", &pos, &ifnone);
block_given = rb_block_given_p();
if (block_given && argc == 2) {
rb_warn("block supersedes default value argument");
}
idx = NUM2LONG(pos);
if (idx < 0) {
idx += RARRAY_LEN(ary);
}
if (idx < 0 || RARRAY_LEN(ary) <= idx) {
if (block_given) return rb_yield(pos);
if (argc == 1) {
rb_raise(rb_eIndexError, "index %ld outside of array bounds: %ld...%ld",
idx - (idx < 0 ? RARRAY_LEN(ary) : 0), -RARRAY_LEN(ary), RARRAY_LEN(ary));
}
return ifnone;
}
return RARRAY_AREF(ary, idx);
}
Gibt das Element von self am Offset index zurück, wenn index im Bereich liegt; index muss ein integer-konvertierbares Objekt sein.
Mit dem einzelnen Argument index und ohne Block wird das Element am Offset index zurückgegeben.
a = [:foo, 'bar', 2] a.fetch(1) # => "bar" a.fetch(1.1) # => "bar"
Wenn index negativ ist, wird vom Ende des Arrays rückwärts gezählt.
a = [:foo, 'bar', 2] a.fetch(-1) # => 2 a.fetch(-2) # => "bar"
Mit den Argumenten index und standardwert (kann jedes Objekt sein) und ohne Block wird standardwert zurückgegeben, wenn index außerhalb des Bereichs liegt.
a = [:foo, 'bar', 2] a.fetch(1, nil) # => "bar" a.fetch(3, :foo) # => :foo
Mit dem Argument index und einem Block wird das Element am Offset index zurückgegeben, wenn index im Bereich liegt (und der Block nicht aufgerufen wird); andernfalls wird der Block mit index aufgerufen und sein Rückgabewert zurückgegeben.
a = [:foo, 'bar', 2] a.fetch(1) {|index| raise 'Cannot happen' } # => "bar" a.fetch(50) {|index| "Value for #{index}" } # => "Value for 50"
Zugehörig: siehe Methoden zum Abrufen.
Source
# File array.rb, line 210 def fetch_values(*indexes, &block) indexes.map! { |i| fetch(i, &block) } indexes end
Ohne Block wird ein neues Array zurückgegeben, das die Elemente von self an den durch indizes spezifizierten Offsets enthält. Jeder der indizes muss ein integer-konvertierbares Objekt sein.
a = [:foo, :bar, :baz] a.fetch_values(2, 0) # => [:baz, :foo] a.fetch_values(2.1, 0) # => [:baz, :foo] a.fetch_values # => []
Für einen negativen Index wird vom Ende des Arrays rückwärts gezählt.
a.fetch_values(-2, -1) # [:bar, :baz]
Wenn kein Block gegeben ist, wird eine Ausnahme ausgelöst, wenn ein Index außerhalb des Bereichs liegt.
Mit einem Block wird für jeden Index
-
Wenn der Index im Bereich liegt, wird ein Element von
selfverwendet (wie oben). -
Andernfalls wird der Block mit dem Index aufgerufen und der Rückgabewert des Blocks verwendet.
Beispiel
a = [:foo, :bar, :baz] a.fetch_values(1, 0, 42, 777) { |index| index.to_s } # => [:bar, :foo, "42", "777"]
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_fill(int argc, VALUE *argv, VALUE ary)
{
VALUE item = Qundef, arg1, arg2;
long beg = 0, end = 0, len = 0;
if (rb_block_given_p()) {
rb_scan_args(argc, argv, "02", &arg1, &arg2);
argc += 1; /* hackish */
}
else {
rb_scan_args(argc, argv, "12", &item, &arg1, &arg2);
}
switch (argc) {
case 1:
beg = 0;
len = RARRAY_LEN(ary);
break;
case 2:
if (rb_range_beg_len(arg1, &beg, &len, RARRAY_LEN(ary), 1)) {
break;
}
/* fall through */
case 3:
beg = NIL_P(arg1) ? 0 : NUM2LONG(arg1);
if (beg < 0) {
beg = RARRAY_LEN(ary) + beg;
if (beg < 0) beg = 0;
}
len = NIL_P(arg2) ? RARRAY_LEN(ary) - beg : NUM2LONG(arg2);
break;
}
rb_ary_modify(ary);
if (len < 0) {
return ary;
}
if (beg >= ARY_MAX_SIZE || len > ARY_MAX_SIZE - beg) {
rb_raise(rb_eArgError, "argument too big");
}
end = beg + len;
if (RARRAY_LEN(ary) < end) {
if (end >= ARY_CAPA(ary)) {
ary_resize_capa(ary, end);
}
ary_mem_clear(ary, RARRAY_LEN(ary), end - RARRAY_LEN(ary));
ARY_SET_LEN(ary, end);
}
if (UNDEF_P(item)) {
VALUE v;
long i;
for (i=beg; i<end; i++) {
v = rb_yield(LONG2NUM(i));
if (i>=RARRAY_LEN(ary)) break;
ARY_SET(ary, i, v);
}
}
else {
ary_memfill(ary, beg, len, item);
}
return ary;
}
Ersetzt ausgewählte Elemente in self; kann Elemente zu self hinzufügen; gibt immer self zurück (nie ein neues Array).
Kurz gesagt:
# Non-negative start. ['a', 'b', 'c', 'd'].fill('-', 1, 2) # => ["a", "-", "-", "d"] ['a', 'b', 'c', 'd'].fill(1, 2) {|e| e.to_s } # => ["a", "1", "2", "d"] # Extends with specified values if necessary. ['a', 'b', 'c', 'd'].fill('-', 3, 2) # => ["a", "b", "c", "-", "-"] ['a', 'b', 'c', 'd'].fill(3, 2) {|e| e.to_s } # => ["a", "b", "c", "3", "4"] # Fills with nils if necessary. ['a', 'b', 'c', 'd'].fill('-', 6, 2) # => ["a", "b", "c", "d", nil, nil, "-", "-"] ['a', 'b', 'c', 'd'].fill(6, 2) {|e| e.to_s } # => ["a", "b", "c", "d", nil, nil, "6", "7"] # For negative start, counts backwards from the end. ['a', 'b', 'c', 'd'].fill('-', -3, 3) # => ["a", "-", "-", "-"] ['a', 'b', 'c', 'd'].fill(-3, 3) {|e| e.to_s } # => ["a", "1", "2", "3"] # Range. ['a', 'b', 'c', 'd'].fill('-', 1..2) # => ["a", "-", "-", "d"] ['a', 'b', 'c', 'd'].fill(1..2) {|e| e.to_s } # => ["a", "1", "2", "d"]
Wenn die Argumente start und anzahl übergeben werden, wählen sie die zu ersetzenden Elemente von self aus; beide müssen ein integer-konvertierbares Objekt (oder nil) sein.
-
startgibt den nullbasierten Offset des ersten zu ersetzenden Elements an;nilbedeutet null. -
anzahlist die Anzahl der aufeinanderfolgenden zu ersetzenden Elemente;nilbedeutet „alle übrigen“.
Mit dem Argument objekt wird dieses eine Objekt für alle Ersetzungen verwendet.
o = Object.new # => #<Object:0x0000014e7bff7600> a = ['a', 'b', 'c', 'd'] # => ["a", "b", "c", "d"] a.fill(o, 1, 2) # => ["a", #<Object:0x0000014e7bff7600>, #<Object:0x0000014e7bff7600>, "d"]
Mit einem Block wird der Block einmal für jedes zu ersetzende Element aufgerufen; der an den Block übergebene Wert ist der *Index* des zu ersetzenden Elements (nicht das Element selbst); der Rückgabewert des Blocks ersetzt das Element.
a = ['a', 'b', 'c', 'd'] # => ["a", "b", "c", "d"] a.fill(1, 2) {|element| element.to_s } # => ["a", "1", "2", "d"]
Für die Argumente start und anzahl
-
Wenn
startnicht negativ ist, werdenanzahlElemente ab dem Offsetstartersetzt.['a', 'b', 'c', 'd'].fill('-', 0, 2) # => ["-", "-", "c", "d"] ['a', 'b', 'c', 'd'].fill('-', 1, 2) # => ["a", "-", "-", "d"] ['a', 'b', 'c', 'd'].fill('-', 2, 2) # => ["a", "b", "-", "-"] ['a', 'b', 'c', 'd'].fill(0, 2) {|e| e.to_s } # => ["0", "1", "c", "d"] ['a', 'b', 'c', 'd'].fill(1, 2) {|e| e.to_s } # => ["a", "1", "2", "d"] ['a', 'b', 'c', 'd'].fill(2, 2) {|e| e.to_s } # => ["a", "b", "2", "3"]
Erweitert
selfbei Bedarf.['a', 'b', 'c', 'd'].fill('-', 3, 2) # => ["a", "b", "c", "-", "-"] ['a', 'b', 'c', 'd'].fill('-', 4, 2) # => ["a", "b", "c", "d", "-", "-"] ['a', 'b', 'c', 'd'].fill(3, 2) {|e| e.to_s } # => ["a", "b", "c", "3", "4"] ['a', 'b', 'c', 'd'].fill(4, 2) {|e| e.to_s } # => ["a", "b", "c", "d", "4", "5"]
Füllt bei Bedarf mit
nil.['a', 'b', 'c', 'd'].fill('-', 5, 2) # => ["a", "b", "c", "d", nil, "-", "-"] ['a', 'b', 'c', 'd'].fill('-', 6, 2) # => ["a", "b", "c", "d", nil, nil, "-", "-"] ['a', 'b', 'c', 'd'].fill(5, 2) {|e| e.to_s } # => ["a", "b", "c", "d", nil, "5", "6"] ['a', 'b', 'c', 'd'].fill(6, 2) {|e| e.to_s } # => ["a", "b", "c", "d", nil, nil, "6", "7"]
Tut nichts, wenn
anzahlnicht positiv ist.['a', 'b', 'c', 'd'].fill('-', 2, 0) # => ["a", "b", "c", "d"] ['a', 'b', 'c', 'd'].fill('-', 2, -100) # => ["a", "b", "c", "d"] ['a', 'b', 'c', 'd'].fill('-', 6, -100) # => ["a", "b", "c", "d"] ['a', 'b', 'c', 'd'].fill(2, 0) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"] ['a', 'b', 'c', 'd'].fill(2, -100) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"] ['a', 'b', 'c', 'd'].fill(6, -100) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"]
-
Wenn
startnegativ ist, wird vom Ende vonselfrückwärts gezählt.['a', 'b', 'c', 'd'].fill('-', -4, 3) # => ["-", "-", "-", "d"] ['a', 'b', 'c', 'd'].fill('-', -3, 3) # => ["a", "-", "-", "-"] ['a', 'b', 'c', 'd'].fill(-4, 3) {|e| e.to_s } # => ["0", "1", "2", "d"] ['a', 'b', 'c', 'd'].fill(-3, 3) {|e| e.to_s } # => ["a", "1", "2", "3"]
Erweitert
selfbei Bedarf.['a', 'b', 'c', 'd'].fill('-', -2, 3) # => ["a", "b", "-", "-", "-"] ['a', 'b', 'c', 'd'].fill('-', -1, 3) # => ["a", "b", "c", "-", "-", "-"] ['a', 'b', 'c', 'd'].fill(-2, 3) {|e| e.to_s } # => ["a", "b", "2", "3", "4"] ['a', 'b', 'c', 'd'].fill(-1, 3) {|e| e.to_s } # => ["a", "b", "c", "3", "4", "5"]
Beginnt am Anfang von
self, wennstartnegativ und außerhalb des Bereichs ist.['a', 'b', 'c', 'd'].fill('-', -5, 2) # => ["-", "-", "c", "d"] ['a', 'b', 'c', 'd'].fill('-', -6, 2) # => ["-", "-", "c", "d"] ['a', 'b', 'c', 'd'].fill(-5, 2) {|e| e.to_s } # => ["0", "1", "c", "d"] ['a', 'b', 'c', 'd'].fill(-6, 2) {|e| e.to_s } # => ["0", "1", "c", "d"]
Tut nichts, wenn
anzahlnicht positiv ist.['a', 'b', 'c', 'd'].fill('-', -2, 0) # => ["a", "b", "c", "d"] ['a', 'b', 'c', 'd'].fill('-', -2, -1) # => ["a", "b", "c", "d"] ['a', 'b', 'c', 'd'].fill(-2, 0) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"] ['a', 'b', 'c', 'd'].fill(-2, -1) {|e| fail 'Cannot happen' } # => ["a", "b", "c", "d"]
Wenn das Argument bereich übergeben wird, muss es ein Range-Objekt sein, dessen Elemente numerisch sind; seine begin- und end-Werte bestimmen die zu ersetzenden Elemente von self.
-
Wenn sowohl
beginals auchendpositiv sind, geben sie das erste und das letzte zu ersetzende Element an.['a', 'b', 'c', 'd'].fill('-', 1..2) # => ["a", "-", "-", "d"] ['a', 'b', 'c', 'd'].fill(1..2) {|e| e.to_s } # => ["a", "1", "2", "d"]
Wenn
endkleiner alsbeginist, werden keine Elemente ersetzt.['a', 'b', 'c', 'd'].fill('-', 2..1) # => ["a", "b", "c", "d"] ['a', 'b', 'c', 'd'].fill(2..1) {|e| e.to_s } # => ["a", "b", "c", "d"]
-
Wenn eines davon negativ ist (oder beide negativ sind), wird vom Ende von
selfrückwärts gezählt.['a', 'b', 'c', 'd'].fill('-', -3..2) # => ["a", "-", "-", "d"] ['a', 'b', 'c', 'd'].fill('-', 1..-2) # => ["a", "-", "-", "d"] ['a', 'b', 'c', 'd'].fill('-', -3..-2) # => ["a", "-", "-", "d"] ['a', 'b', 'c', 'd'].fill(-3..2) {|e| e.to_s } # => ["a", "1", "2", "d"] ['a', 'b', 'c', 'd'].fill(1..-2) {|e| e.to_s } # => ["a", "1", "2", "d"] ['a', 'b', 'c', 'd'].fill(-3..-2) {|e| e.to_s } # => ["a", "1", "2", "d"]
-
Wenn der
end-Wert ausgeschlossen ist (sieheRange#exclude_end?), wird die letzte Ersetzung weggelassen.['a', 'b', 'c', 'd'].fill('-', 1...2) # => ["a", "-", "c", "d"] ['a', 'b', 'c', 'd'].fill('-', 1...-2) # => ["a", "-", "c", "d"] ['a', 'b', 'c', 'd'].fill(1...2) {|e| e.to_s } # => ["a", "1", "c", "d"] ['a', 'b', 'c', 'd'].fill(1...-2) {|e| e.to_s } # => ["a", "1", "c", "d"]
-
Wenn der Bereich endlos ist (siehe Endlose Bereiche), werden Elemente bis zum Ende von
selfersetzt.['a', 'b', 'c', 'd'].fill('-', 1..) # => ["a", "-", "-", "-"] ['a', 'b', 'c', 'd'].fill(1..) {|e| e.to_s } # => ["a", "1", "2", "3"]
-
Wenn der Bereich beginnloses ist (siehe Beginnlose Bereiche), werden Elemente vom Anfang von
selfersetzt.['a', 'b', 'c', 'd'].fill('-', ..2) # => ["-", "-", "-", "d"] ['a', 'b', 'c', 'd'].fill(..2) {|e| e.to_s } # => ["0", "1", "2", "d"]
Zugehörig: siehe Methoden zum Zuweisen.
Mit einem Block wird der Block mit jedem Element von self aufgerufen; es wird ein neues Array zurückgegeben, das die Elemente von self enthält, für die der Block einen wahrheitsgemäßen Wert zurückgibt.
a = [:foo, 'bar', 2, :bam] a.select {|element| element.to_s.start_with?('b') } # => ["bar", :bam]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Abrufen.
Mit einem Block wird der Block mit jedem Element von self aufgerufen; Elemente werden aus self entfernt, wenn der Block false oder nil zurückgibt.
Gibt self zurück, wenn Elemente entfernt wurden.
a = [:foo, 'bar', 2, :bam] a.select! {|element| element.to_s.start_with?('b') } # => ["bar", :bam]
Gibt nil zurück, wenn keine Elemente entfernt wurden.
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Löschen.
Source
static VALUE
rb_ary_find(int argc, VALUE *argv, VALUE ary)
{
VALUE if_none;
long idx;
RETURN_ENUMERATOR(ary, argc, argv);
if_none = rb_check_arity(argc, 0, 1) ? argv[0] : Qnil;
for (idx = 0; idx < RARRAY_LEN(ary); idx++) {
VALUE elem = RARRAY_AREF(ary, idx);
if (RTEST(rb_yield(elem))) {
return elem;
}
}
if (!NIL_P(if_none)) {
return rb_funcallv(if_none, idCall, 0, 0);
}
return Qnil;
}
Gibt das erste Element zurück, für das der Block einen wahrheitsgemäßen Wert zurückgibt.
Mit einem Block wird der Block mit aufeinanderfolgenden Elementen des Arrays aufgerufen; es wird das erste Element zurückgegeben, für das der Block einen wahrheitsgemäßen Wert zurückgibt.
[1, 3, 5].find {|element| element > 2} # => 3
Wenn kein solches Element gefunden wird, wird falls_nicht_gefunden_proc aufgerufen und dessen Rückgabewert zurückgegeben.
[1, 3, 5].find(proc {-1}) {|element| element > 12} # => -1
Ohne Block wird ein Enumerator zurückgegeben.
Source
static VALUE
rb_ary_index(int argc, VALUE *argv, VALUE ary)
{
VALUE val;
long i;
if (argc == 0) {
RETURN_ENUMERATOR(ary, 0, 0);
for (i=0; i<RARRAY_LEN(ary); i++) {
if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) {
return LONG2NUM(i);
}
}
return Qnil;
}
rb_check_arity(argc, 0, 1);
val = argv[0];
if (rb_block_given_p())
rb_warn("given block not used");
for (i=0; i<RARRAY_LEN(ary); i++) {
VALUE e = RARRAY_AREF(ary, i);
if (rb_equal(e, val)) {
return LONG2NUM(i);
}
}
return Qnil;
}
Gibt den nullbasierten ganzzahligen Index eines angegebenen Elements zurück, oder nil.
Wenn nur das Argument objekt übergeben wird, wird der Index des ersten Elements element zurückgegeben, für das objekt == element gilt.
a = [:foo, 'bar', 2, 'bar'] a.index('bar') # => 1
Gibt nil zurück, wenn kein solches Element gefunden wurde.
Wenn nur ein Block gegeben ist, wird der Block mit jedem aufeinanderfolgenden Element aufgerufen; es wird der Index des ersten Elements zurückgegeben, für das der Block einen wahrheitsgemäßen Wert zurückgibt.
a = [:foo, 'bar', 2, 'bar'] a.index {|element| element == 'bar' } # => 1
Gibt nil zurück, wenn der Block niemals einen wahrheitsgemäßen Wert zurückgibt.
Wenn weder ein Argument noch ein Block gegeben ist, wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zur Abfrage.
Source
# File array.rb, line 129 def first n = unspecified = true if Primitive.mandatory_only? Primitive.attr! :leaf Primitive.cexpr! %q{ ary_first(self) } else if unspecified Primitive.cexpr! %q{ ary_first(self) } else Primitive.cexpr! %q{ ary_take_first_or_last_n(self, NUM2LONG(n), ARY_TAKE_FIRST) } end end end
Gibt Elemente aus self oder nil zurück; modifiziert self nicht.
Ohne Argument wird das erste Element zurückgegeben (falls verfügbar).
a = [:foo, 'bar', 2] a.first # => :foo a # => [:foo, "bar", 2]
Wenn self leer ist, wird nil zurückgegeben.
[].first # => nil
Mit einem nicht-negativen ganzzahligen Argument anzahl werden die ersten anzahl Elemente (sofern verfügbar) in einem neuen Array zurückgegeben.
a.first(0) # => [] a.first(2) # => [:foo, "bar"] a.first(50) # => [:foo, "bar", 2]
Zugehörig: siehe Methoden zur Abfrage.
Source
static VALUE
rb_ary_flatten(int argc, VALUE *argv, VALUE ary)
{
int level = -1;
VALUE result;
if (rb_check_arity(argc, 0, 1) && !NIL_P(argv[0])) {
level = NUM2INT(argv[0]);
if (level == 0) return ary_make_shared_copy(ary);
}
result = flatten(ary, level);
if (result == ary) {
result = ary_make_shared_copy(ary);
}
return result;
}
Gibt ein neues Array zurück, das eine rekursive Abflachung von self auf tiefe Rekursionsebenen ist; tiefe muss ein integer-konvertierbares Objekt oder nil sein. Auf jeder Rekursionsebene
-
Jedes Element, das ein Array ist, wird "abgeflacht" (d.h. durch seine einzelnen Array-Elemente ersetzt).
-
Jedes Element, das kein Array ist, bleibt unverändert (auch wenn das Element ein Objekt ist, das die Instanzmethode
flattenhat).
Mit einem nicht-negativen ganzzahligen Argument tiefe werden rekursiv durch tiefe Ebenen abgeflacht.
a = [ 0, [ 1, [2, 3], 4 ], 5, {foo: 0}, Set.new([6, 7]) ] a # => [0, [1, [2, 3], 4], 5, {:foo=>0}, #<Set: {6, 7}>] a.flatten(0) # => [0, [1, [2, 3], 4], 5, {:foo=>0}, #<Set: {6, 7}>] a.flatten(1 ) # => [0, 1, [2, 3], 4, 5, {:foo=>0}, #<Set: {6, 7}>] a.flatten(1.1) # => [0, 1, [2, 3], 4, 5, {:foo=>0}, #<Set: {6, 7}>] a.flatten(2) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #<Set: {6, 7}>] a.flatten(3) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #<Set: {6, 7}>]
Mit nil oder negativem tiefe werden alle Ebenen abgeflacht.
a.flatten # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #<Set: {6, 7}>] a.flatten(-1) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #<Set: {6, 7}>]
Zugehörig: Array#flatten!; siehe auch Methoden zur Konvertierung.
Source
static VALUE
rb_ary_flatten_bang(int argc, VALUE *argv, VALUE ary)
{
int mod = 0, level = -1;
VALUE result, lv;
lv = (rb_check_arity(argc, 0, 1) ? argv[0] : Qnil);
rb_ary_modify_check(ary);
if (!NIL_P(lv)) level = NUM2INT(lv);
if (level == 0) return Qnil;
result = flatten(ary, level);
if (result == ary) {
return Qnil;
}
if (!(mod = ARY_EMBED_P(result))) rb_ary_freeze(result);
rb_ary_replace(ary, result);
if (mod) ARY_SET_EMBED_LEN(result, 0);
return ary;
}
Gibt self als rekursive Abflachung von self auf tiefe Rekursionsebenen zurück; tiefe muss ein integer-konvertierbares Objekt oder nil sein. Auf jeder Rekursionsebene
-
Jedes Element, das ein Array ist, wird "abgeflacht" (d.h. durch seine einzelnen Array-Elemente ersetzt).
-
Jedes Element, das kein Array ist, bleibt unverändert (auch wenn das Element ein Objekt ist, das die Instanzmethode
flattenhat).
Gibt nil zurück, wenn keine Elemente abgeflacht wurden.
Mit einem nicht-negativen ganzzahligen Argument tiefe werden rekursiv durch tiefe Ebenen abgeflacht.
a = [ 0, [ 1, [2, 3], 4 ], 5, {foo: 0}, Set.new([6, 7]) ] a # => [0, [1, [2, 3], 4], 5, {:foo=>0}, #<Set: {6, 7}>] a.dup.flatten!(1) # => [0, 1, [2, 3], 4, 5, {:foo=>0}, #<Set: {6, 7}>] a.dup.flatten!(1.1) # => [0, 1, [2, 3], 4, 5, {:foo=>0}, #<Set: {6, 7}>] a.dup.flatten!(2) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #<Set: {6, 7}>] a.dup.flatten!(3) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #<Set: {6, 7}>]
Mit einem nil oder negativen Argument tiefe werden alle Ebenen abgeflacht.
a.dup.flatten! # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #<Set: {6, 7}>] a.dup.flatten!(-1) # => [0, 1, 2, 3, 4, 5, {:foo=>0}, #<Set: {6, 7}>]
Zugehörig: Array#flatten; siehe auch Methoden zum Zuweisen.
Source
VALUE
rb_ary_freeze(VALUE ary)
{
RUBY_ASSERT(RB_TYPE_P(ary, T_ARRAY));
if (OBJ_FROZEN(ary)) return ary;
if (!ARY_EMBED_P(ary) && !ARY_SHARED_P(ary) && !ARY_SHARED_ROOT_P(ary)) {
ary_shrink_capa(ary);
}
return rb_obj_freeze(ary);
}
Friert self ein (wenn nicht bereits eingefroren); gibt self zurück.
a = [] a.frozen? # => false a.freeze a.frozen? # => true
Es können keine weiteren Änderungen an self vorgenommen werden; löst FrozenError aus, wenn eine Änderung versucht wird.
Zugehörig: Kernel#frozen?.
Source
static VALUE
rb_ary_hash(VALUE ary)
{
RBIMPL_ASSERT_OR_ASSUME(ary);
return ary_hash_values(RARRAY_LEN(ary), RARRAY_CONST_PTR(ary), ary);
}
Gibt den ganzzahligen Hash-Wert für self zurück.
Zwei Arrays mit gleichem Inhalt haben den gleichen Hash-Wert (und werden mit eql? verglichen).
['a', 'b'].hash == ['a', 'b'].hash # => true ['a', 'b'].hash == ['a', 'c'].hash # => false ['a', 'b'].hash == ['a'].hash # => false
Source
VALUE
rb_ary_includes(VALUE ary, VALUE item)
{
long i;
VALUE e;
for (i=0; i<RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
if (rb_equal(e, item)) {
return Qtrue;
}
}
return Qfalse;
}
Gibt zurück, ob für ein Element element in self gilt: objekt == element.
[0, 1, 2].include?(2) # => true [0, 1, 2].include?(2.0) # => true [0, 1, 2].include?(2.1) # => false
Zugehörig: siehe Methoden zur Abfrage.
Gibt den nullbasierten ganzzahligen Index eines angegebenen Elements zurück, oder nil.
Wenn nur das Argument objekt übergeben wird, wird der Index des ersten Elements element zurückgegeben, für das objekt == element gilt.
a = [:foo, 'bar', 2, 'bar'] a.index('bar') # => 1
Gibt nil zurück, wenn kein solches Element gefunden wurde.
Wenn nur ein Block gegeben ist, wird der Block mit jedem aufeinanderfolgenden Element aufgerufen; es wird der Index des ersten Elements zurückgegeben, für das der Block einen wahrheitsgemäßen Wert zurückgibt.
a = [:foo, 'bar', 2, 'bar'] a.index {|element| element == 'bar' } # => 1
Gibt nil zurück, wenn der Block niemals einen wahrheitsgemäßen Wert zurückgibt.
Wenn weder ein Argument noch ein Block gegeben ist, wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zur Abfrage.
Source
VALUE
rb_ary_replace(VALUE copy, VALUE orig)
{
rb_ary_modify_check(copy);
orig = to_ary(orig);
if (copy == orig) return copy;
rb_ary_reset(copy);
/* orig has enough space to embed the contents of orig. */
if (RARRAY_LEN(orig) <= ary_embed_capa(copy)) {
RUBY_ASSERT(ARY_EMBED_P(copy));
ary_memcpy(copy, 0, RARRAY_LEN(orig), RARRAY_CONST_PTR(orig));
ARY_SET_EMBED_LEN(copy, RARRAY_LEN(orig));
}
/* orig is embedded but copy does not have enough space to embed the
* contents of orig. */
else if (ARY_EMBED_P(orig)) {
long len = ARY_EMBED_LEN(orig);
VALUE *ptr = ary_heap_alloc_buffer(len);
FL_UNSET_EMBED(copy);
ARY_SET_PTR(copy, ptr);
ARY_SET_LEN(copy, len);
ARY_SET_CAPA(copy, len);
// No allocation and exception expected that could leave `copy` in a
// bad state from the edits above.
ary_memcpy(copy, 0, len, RARRAY_CONST_PTR(orig));
}
/* Otherwise, orig is on heap and copy does not have enough space to embed
* the contents of orig. */
else {
VALUE shared_root = ary_make_shared(orig);
FL_UNSET_EMBED(copy);
ARY_SET_PTR(copy, ARY_HEAP_PTR(orig));
ARY_SET_LEN(copy, ARY_HEAP_LEN(orig));
rb_ary_set_shared(copy, shared_root);
RUBY_ASSERT(RB_OBJ_SHAREABLE_P(copy) ? RB_OBJ_SHAREABLE_P(shared_root) : 1);
}
ary_verify(copy);
return copy;
}
Ersetzt die Elemente von self durch die Elemente von anderes_array, das ein array-konvertierbares Objekt sein muss; gibt self zurück.
a = ['a', 'b', 'c'] # => ["a", "b", "c"] a.replace(['d', 'e']) # => ["d", "e"]
Zugehörig: siehe Methoden zum Zuweisen.
Source
static VALUE
rb_ary_insert(int argc, VALUE *argv, VALUE ary)
{
long pos;
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
rb_ary_modify_check(ary);
pos = NUM2LONG(argv[0]);
if (argc == 1) return ary;
if (pos == -1) {
pos = RARRAY_LEN(ary);
}
else if (pos < 0) {
long minpos = -RARRAY_LEN(ary) - 1;
if (pos < minpos) {
rb_raise(rb_eIndexError, "index %ld too small for array; minimum: %ld",
pos, minpos);
}
pos++;
}
rb_ary_splice(ary, pos, 0, argv + 1, argc - 1);
return ary;
}
Fügt die gegebenen objekte als Elemente von self ein; gibt self zurück.
Wenn index nicht negativ ist, werden objekte *vor* dem Element am Offset index eingefügt.
a = ['a', 'b', 'c'] # => ["a", "b", "c"] a.insert(1, :x, :y, :z) # => ["a", :x, :y, :z, "b", "c"]
Erweitert das Array, wenn index über das Array hinausgeht (index >= self.size).
a = ['a', 'b', 'c'] # => ["a", "b", "c"] a.insert(5, :x, :y, :z) # => ["a", "b", "c", nil, nil, :x, :y, :z]
Wenn index negativ ist, werden objekte *nach* dem Element am Offset index + self.size eingefügt.
a = ['a', 'b', 'c'] # => ["a", "b", "c"] a.insert(-2, :x, :y, :z) # => ["a", "b", :x, :y, :z, "c"]
Wenn keine objekte gegeben sind, tut dies nichts.
a = ['a', 'b', 'c'] # => ["a", "b", "c"] a.insert(1) # => ["a", "b", "c"] a.insert(50) # => ["a", "b", "c"] a.insert(-50) # => ["a", "b", "c"]
Löst IndexError aus, wenn objekte gegeben sind und index negativ und außerhalb des Bereichs ist.
Zugehörig: siehe Methoden zum Zuweisen.
Source
static VALUE
rb_ary_inspect(VALUE ary)
{
if (RARRAY_LEN(ary) == 0) return rb_usascii_str_new2("[]");
return rb_exec_recursive(inspect_ary, ary, 0);
}
Gibt die neue Zeichenkette zurück, die durch Aufrufen der Methode inspect für jedes Array-Element gebildet wird.
a = [:foo, 'bar', 2] a.inspect # => "[:foo, \"bar\", 2]"
Zugehörig: siehe Methoden zur Konvertierung.
Source
static VALUE
rb_ary_intersect_p(VALUE ary1, VALUE ary2)
{
VALUE hash, v, result, shorter, longer;
st_data_t vv;
long i;
ary2 = to_ary(ary2);
if (RARRAY_LEN(ary1) == 0 || RARRAY_LEN(ary2) == 0) return Qfalse;
if (RARRAY_LEN(ary1) <= SMALL_ARRAY_LEN && RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
for (i=0; i<RARRAY_LEN(ary1); i++) {
v = RARRAY_AREF(ary1, i);
if (rb_ary_includes_by_eql(ary2, v)) return Qtrue;
}
return Qfalse;
}
shorter = ary1;
longer = ary2;
if (RARRAY_LEN(ary1) > RARRAY_LEN(ary2)) {
longer = ary1;
shorter = ary2;
}
hash = ary_make_hash(shorter);
result = Qfalse;
for (i=0; i<RARRAY_LEN(longer); i++) {
v = RARRAY_AREF(longer, i);
vv = (st_data_t)v;
if (rb_hash_stlike_lookup(hash, vv, 0)) {
result = Qtrue;
break;
}
}
return result;
}
Gibt zurück, ob anderes_array mindestens ein Element hat, das eql? zu einem Element von self ist.
[1, 2, 3].intersect?([3, 4, 5]) # => true [1, 2, 3].intersect?([4, 5, 6]) # => false
Jedes Element muss die Methode hash korrekt implementieren.
Zugehörig: siehe Methoden zur Abfrage.
Source
static VALUE
rb_ary_intersection_multi(int argc, VALUE *argv, VALUE ary)
{
VALUE result = rb_ary_dup(ary);
int i;
for (i = 0; i < argc; i++) {
result = rb_ary_and(result, argv[i]);
}
return result;
}
Gibt ein neues Array zurück, das jedes Element in self enthält, das eql? zu mindestens einem Element in jedem der gegebenen andere_arrays ist; Duplikate werden weggelassen.
[0, 0, 1, 1, 2, 3].intersection([0, 1, 2], [0, 1, 3]) # => [0, 1]
Jedes Element muss die Methode hash korrekt implementieren.
Die Reihenfolge aus self bleibt erhalten.
[0, 1, 2].intersection([2, 1, 0]) # => [0, 1, 2]
Gibt eine Kopie von self zurück, wenn keine Argumente übergeben werden.
Zugehörig: siehe Methoden zum Kombinieren.
Source
static VALUE
rb_ary_join_m(int argc, VALUE *argv, VALUE ary)
{
VALUE sep;
if (rb_check_arity(argc, 0, 1) == 0 || NIL_P(sep = argv[0])) {
sep = rb_output_fs;
if (!NIL_P(sep)) {
rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "$, is set to non-nil value");
}
}
return rb_ary_join(ary, sep);
}
Gibt die neue Zeichenkette zurück, die durch Verknüpfen der konvertierten Elemente von self gebildet wird; für jedes Element element
-
Rekursiv konvertiert mit
element.join(trenner), wennelementeinekind_of?(Array)ist. -
Andernfalls wird mit
element.to_skonvertiert.
Ohne Argument wird mit dem Ausgabefeldtrenner $, verknüpft.
a = [:foo, 'bar', 2] $, # => nil a.join # => "foobar2"
Mit einem Zeichenkettenargument trenner wird mit diesem Trenner verknüpft.
a = [:foo, 'bar', 2] a.join("\n") # => "foo\nbar\n2"
Verknüpft rekursiv für verschachtelte Arrays.
a = [:foo, [:bar, [:baz, :bat]]] a.join # => "foobarbazbat"
Zugehörig: siehe Methoden zur Konvertierung.
Source
static VALUE
rb_ary_keep_if(VALUE ary)
{
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
rb_ary_select_bang(ary);
return ary;
}
Mit einem Block wird der Block mit jedem Element von self aufgerufen; das Element wird aus self entfernt, wenn der Block keinen wahrheitsgemäßen Wert zurückgibt.
a = [:foo, 'bar', 2, :bam] a.keep_if {|element| element.to_s.start_with?('b') } # => ["bar", :bam]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Löschen.
Source
# File array.rb, line 166 def last n = unspecified = true if Primitive.mandatory_only? Primitive.attr! :leaf Primitive.cexpr! %q{ ary_last(self) } else if unspecified Primitive.cexpr! %q{ ary_last(self) } else Primitive.cexpr! %q{ ary_take_first_or_last_n(self, NUM2LONG(n), ARY_TAKE_LAST) } end end end
Gibt Elemente aus self oder nil zurück; self wird nicht modifiziert.
Ohne Argument wird das letzte Element zurückgegeben, oder nil, wenn self leer ist.
a = [:foo, 'bar', 2] a.last # => 2 a # => [:foo, "bar", 2] [].last # => nil
Mit einem nicht-negativen ganzzahligen Argument anzahl wird ein neues Array zurückgegeben, das die abschließenden anzahl Elemente von self enthält, so wie sie verfügbar sind.
a = [:foo, 'bar', 2] a.last(2) # => ["bar", 2] a.last(50) # => [:foo, "bar", 2] a.last(0) # => [] [].last(3) # => []
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_length(VALUE ary)
{
long len = RARRAY_LEN(ary);
return LONG2NUM(len);
}
Gibt die Anzahl der Elemente in self zurück.
[0, 1, 2].length # => 3 [].length # => 0
Zugehörig: siehe Methoden zur Abfrage.
Mit einem Block wird der Block mit jedem Element von self aufgerufen; es wird ein neues Array zurückgegeben, dessen Elemente die Rückgabewerte des Blocks sind.
a = [:foo, 'bar', 2] a1 = a.map {|element| element.class } a1 # => [Symbol, String, Integer]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: collect!; siehe auch Methoden zur Konvertierung.
Mit einem Block wird der Block mit jedem Element von self aufgerufen und das Element durch den Rückgabewert des Blocks ersetzt; gibt self zurück.
a = [:foo, 'bar', 2] a.map! { |element| element.class } # => [Symbol, String, Integer]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: collect; siehe auch Methoden zur Konvertierung.
Source
static VALUE
rb_ary_max(int argc, VALUE *argv, VALUE ary)
{
VALUE result = Qundef, v;
VALUE num;
long i;
if (rb_check_arity(argc, 0, 1) && !NIL_P(num = argv[0]))
return rb_nmin_run(ary, num, 0, 1, 1);
const long n = RARRAY_LEN(ary);
if (rb_block_given_p()) {
for (i = 0; i < RARRAY_LEN(ary); i++) {
v = RARRAY_AREF(ary, i);
if (UNDEF_P(result) || rb_cmpint(rb_yield_values(2, v, result), v, result) > 0) {
result = v;
}
}
}
else if (n > 0) {
result = RARRAY_AREF(ary, 0);
if (n > 1) {
if (FIXNUM_P(result) && CMP_OPTIMIZABLE(INTEGER)) {
return ary_max_opt_fixnum(ary, 1, result);
}
else if (STRING_P(result) && CMP_OPTIMIZABLE(STRING)) {
return ary_max_opt_string(ary, 1, result);
}
else if (RB_FLOAT_TYPE_P(result) && CMP_OPTIMIZABLE(FLOAT)) {
return ary_max_opt_float(ary, 1, result);
}
else {
return ary_max_generic(ary, 1, result);
}
}
}
if (UNDEF_P(result)) return Qnil;
return result;
}
Gibt eines der folgenden zurück:
-
Das Element mit dem größten Wert aus
self. -
Ein neues Array mit Elementen mit dem größten Wert aus
self.
Modifiziert self nicht.
Ohne Block muss jedes Element in self auf die Methode <=> mit einer Zahl antworten.
Ohne Argument und ohne Block wird das Element in self zurückgegeben, das den größten Wert gemäß der Methode <=> hat.
[1, 0, 3, 2].max # => 3
Mit einem nicht-negativen ganzzahligen Argument anzahl und ohne Block wird ein neues Array mit höchstens anzahl Elementen zurückgegeben, in absteigender Reihenfolge, gemäß der Methode <=>.
[1, 0, 3, 2].max(3) # => [3, 2, 1] [1, 0, 3, 2].max(3.0) # => [3, 2, 1] [1, 0, 3, 2].max(9) # => [3, 2, 1, 0] [1, 0, 3, 2].max(0) # => []
Mit einem Block muss der Block eine Zahl zurückgeben.
Mit einem Block und ohne Argument wird der Block self.size - 1 Mal aufgerufen, um Elemente zu vergleichen; das Element mit dem größten Wert gemäß dem Block wird zurückgegeben.
['0', '', '000', '00'].max {|a, b| a.size <=> b.size } # => "000"
Mit einem nicht-negativen ganzzahligen Argument anzahl und einem Block wird ein neues Array mit höchstens anzahl Elementen zurückgegeben, in absteigender Reihenfolge, gemäß dem Block.
['0', '', '000', '00'].max(2) {|a, b| a.size <=> b.size } # => ["000", "00"]
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_min(int argc, VALUE *argv, VALUE ary)
{
VALUE result = Qundef, v;
VALUE num;
long i;
if (rb_check_arity(argc, 0, 1) && !NIL_P(num = argv[0]))
return rb_nmin_run(ary, num, 0, 0, 1);
const long n = RARRAY_LEN(ary);
if (rb_block_given_p()) {
for (i = 0; i < RARRAY_LEN(ary); i++) {
v = RARRAY_AREF(ary, i);
if (UNDEF_P(result) || rb_cmpint(rb_yield_values(2, v, result), v, result) < 0) {
result = v;
}
}
}
else if (n > 0) {
result = RARRAY_AREF(ary, 0);
if (n > 1) {
if (FIXNUM_P(result) && CMP_OPTIMIZABLE(INTEGER)) {
return ary_min_opt_fixnum(ary, 1, result);
}
else if (STRING_P(result) && CMP_OPTIMIZABLE(STRING)) {
return ary_min_opt_string(ary, 1, result);
}
else if (RB_FLOAT_TYPE_P(result) && CMP_OPTIMIZABLE(FLOAT)) {
return ary_min_opt_float(ary, 1, result);
}
else {
return ary_min_generic(ary, 1, result);
}
}
}
if (UNDEF_P(result)) return Qnil;
return result;
}
Gibt eines der folgenden zurück:
-
Das Element mit dem kleinsten Wert aus
self. -
Ein neues Array mit Elementen des kleinsten Werts aus
self.
Modifiziert self nicht.
Ohne Block muss jedes Element in self auf die Methode <=> mit einer Zahl antworten.
Ohne Argument und ohne Block gibt das Element in self mit dem kleinsten Wert gemäß Methode <=> zurück.
[1, 0, 3, 2].min # => 0
Mit einem nicht-negativen numerischen Argument count und ohne Block gibt ein neues Array mit höchstens count Elementen in aufsteigender Reihenfolge gemäß Methode <=> zurück.
[1, 0, 3, 2].min(3) # => [0, 1, 2] [1, 0, 3, 2].min(3.0) # => [0, 1, 2] [1, 0, 3, 2].min(9) # => [0, 1, 2, 3] [1, 0, 3, 2].min(0) # => []
Mit einem Block muss der Block eine Zahl zurückgeben.
Mit einem Block und ohne Argument wird der Block self.size - 1 Mal aufgerufen, um Elemente zu vergleichen; gibt das Element mit dem kleinsten Wert gemäß dem Block zurück.
['0', '', '000', '00'].min {|a, b| a.size <=> b.size } # => ""
Mit einem nicht-negativen numerischen Argument count und einem Block gibt ein neues Array mit höchstens count Elementen in aufsteigender Reihenfolge gemäß dem Block zurück.
['0', '', '000', '00'].min(2) {|a, b| a.size <=> b.size } # => ["", "0"]
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_minmax(VALUE ary)
{
if (rb_block_given_p()) {
return rb_call_super(0, NULL);
}
return rb_assoc_new(rb_ary_min(0, 0, ary), rb_ary_max(0, 0, ary));
}
Gibt ein 2-elementiges Array zurück, das das Element mit dem kleinsten und das Element mit dem größten Wert aus self enthält; self wird nicht verändert.
Ohne Block werden das Minimum und das Maximum mithilfe der Methode <=> bestimmt.
[1, 0, 3, 2].minmax # => [0, 3]
Mit einem Block muss der Block eine Zahl zurückgeben; der Block wird self.size - 1 Mal aufgerufen, um Elemente zu vergleichen; gibt die Elemente mit dem minimalen und maximalen Wert gemäß dem Block zurück.
['0', '', '000', '00'].minmax {|a, b| a.size <=> b.size } # => ["", "000"]
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_none_p(int argc, VALUE *argv, VALUE ary)
{
long i, len = RARRAY_LEN(ary);
rb_check_arity(argc, 0, 1);
if (!len) return Qtrue;
if (argc) {
if (rb_block_given_p()) {
rb_warn("given block not used");
}
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) return Qfalse;
}
}
else if (!rb_block_given_p()) {
for (i = 0; i < len; ++i) {
if (RTEST(RARRAY_AREF(ary, i))) return Qfalse;
}
}
else {
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qfalse;
}
}
return Qtrue;
}
Gibt true zurück, wenn kein Element von self ein gegebenes Kriterium erfüllt, andernfalls false.
Ohne Block und ohne Argument gibt true zurück, wenn self keine truthy Elemente hat, andernfalls false.
[nil, false].none? # => true [nil, 0, false].none? # => false [].none? # => true
Mit dem Argument object wird false zurückgegeben, wenn für irgendein Element element gilt object === element; andernfalls true.
['food', 'drink'].none?(/bar/) # => true ['food', 'drink'].none?(/foo/) # => false [].none?(/foo/) # => true [0, 1, 2].none?(3) # => true [0, 1, 2].none?(1) # => false
Mit einem Block wird der Block mit jedem Element von self aufgerufen; gibt true zurück, wenn der Block keinen truthy Wert zurückgibt, andernfalls false.
[0, 1, 2].none? {|element| element > 3 } # => true [0, 1, 2].none? {|element| element > 1 } # => false
Zugehörig: siehe Methoden zur Abfrage.
Source
static VALUE
rb_ary_one_p(int argc, VALUE *argv, VALUE ary)
{
long i, len = RARRAY_LEN(ary);
VALUE result = Qfalse;
rb_check_arity(argc, 0, 1);
if (!len) return Qfalse;
if (argc) {
if (rb_block_given_p()) {
rb_warn("given block not used");
}
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) {
if (result) return Qfalse;
result = Qtrue;
}
}
}
else if (!rb_block_given_p()) {
for (i = 0; i < len; ++i) {
if (RTEST(RARRAY_AREF(ary, i))) {
if (result) return Qfalse;
result = Qtrue;
}
}
}
else {
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) {
if (result) return Qfalse;
result = Qtrue;
}
}
}
return result;
}
Gibt true zurück, wenn genau ein Element von self ein gegebenes Kriterium erfüllt.
Ohne Block und ohne Argument gibt true zurück, wenn self genau ein truthy Element hat, andernfalls false.
[nil, 0].one? # => true [0, 0].one? # => false [nil, nil].one? # => false [].one? # => false
Mit einem Block wird der Block mit jedem Element von self aufgerufen; gibt true zurück, wenn der Block für genau ein Element einen truthy Wert zurückgibt, andernfalls false.
[0, 1, 2].one? {|element| element > 0 } # => false [0, 1, 2].one? {|element| element > 1 } # => true [0, 1, 2].one? {|element| element > 2 } # => false
Mit dem Argument object wird true zurückgegeben, wenn für genau ein Element element gilt object === element; andernfalls false.
[0, 1, 2].one?(0) # => true [0, 0, 1].one?(0) # => false [1, 1, 2].one?(0) # => false ['food', 'drink'].one?(/bar/) # => false ['food', 'drink'].one?(/foo/) # => true [].one?(/foo/) # => false
Zugehörig: siehe Methoden zur Abfrage.
Source
# File pack.rb, line 7 def pack(fmt, buffer: nil) Primitive.pack_pack(fmt, buffer) end
Formatiert jedes Element in self zu einem Binärstring; gibt diesen String zurück. Siehe Packed Data.
Source
static VALUE
rb_ary_permutation(int argc, VALUE *argv, VALUE ary)
{
long r, n, i;
n = RARRAY_LEN(ary); /* Array length */
RETURN_SIZED_ENUMERATOR(ary, argc, argv, rb_ary_permutation_size); /* Return enumerator if no block */
r = n;
if (rb_check_arity(argc, 0, 1) && !NIL_P(argv[0]))
r = NUM2LONG(argv[0]); /* Permutation size from argument */
if (r < 0 || n < r) {
/* no permutations: yield nothing */
}
else if (r == 0) { /* exactly one permutation: the zero-length array */
rb_yield(rb_ary_new2(0));
}
else if (r == 1) { /* this is a special, easy case */
for (i = 0; i < RARRAY_LEN(ary); i++) {
rb_yield(rb_ary_new3(1, RARRAY_AREF(ary, i)));
}
}
else { /* this is the general case */
volatile VALUE t0;
long *p = ALLOCV_N(long, t0, r+roomof(n, sizeof(long)));
char *used = (char*)(p + r);
VALUE ary0 = ary_make_shared_copy(ary); /* private defensive copy of ary */
RBASIC_CLEAR_CLASS(ary0);
MEMZERO(used, char, n); /* initialize array */
permute0(n, r, p, used, ary0); /* compute and yield permutations */
ALLOCV_END(t0);
RBASIC_SET_CLASS_RAW(ary0, rb_cArray);
}
return ary;
}
Iteriert über Permutationen der Elemente von self; die Reihenfolge der Permutationen ist unbestimmt.
Mit einem Block und einem positiven ganzzahligen Argument count im Bereich (0 < count <= self.size) wird der Block mit jeder Permutation von self der Größe count aufgerufen; gibt self zurück.
a = [0, 1, 2] perms = [] a.permutation(1) {|perm| perms.push(perm) } perms # => [[0], [1], [2]] perms = [] a.permutation(2) {|perm| perms.push(perm) } perms # => [[0, 1], [0, 2], [1, 0], [1, 2], [2, 0], [2, 1]] perms = [] a.permutation(3) {|perm| perms.push(perm) } perms # => [[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]]
Wenn anzahl null ist, wird der Block einmal mit einem neuen leeren Array aufgerufen.
perms = [] a.permutation(0) {|perm| perms.push(perm) } perms # => [[]]
Wenn count außerhalb des Bereichs liegt (negativ oder größer als self.size), wird der Block nicht aufgerufen.
a.permutation(-1) {|permutation| fail 'Cannot happen' } a.permutation(4) {|permutation| fail 'Cannot happen' }
Ohne Block wird ein neuer Enumerator zurückgegeben.
Siehe auch: Methoden für die Iteration.
Source
static VALUE
rb_ary_pop_m(int argc, VALUE *argv, VALUE ary)
{
VALUE result;
if (argc == 0) {
return rb_ary_pop(ary);
}
rb_ary_modify_check(ary);
result = ary_take_first_or_last(argc, argv, ary, ARY_TAKE_LAST);
ARY_INCREASE_LEN(ary, -RARRAY_LEN(result));
ary_verify(ary);
return result;
}
Entfernt und gibt nachfolgende Elemente aus self zurück.
Ohne Argument wird das letzte Element, falls vorhanden, entfernt und zurückgegeben; andernfalls wird nil zurückgegeben.
a = [:foo, 'bar', 2] a.pop # => 2 a # => [:foo, "bar"] [].pop # => nil
Mit einem nicht-negativen ganzzahligen Argument anzahl wird ein neues Array zurückgegeben, das die abschließenden anzahl Elemente von self enthält, so wie sie verfügbar sind.
a = [:foo, 'bar', 2] a.pop(2) # => ["bar", 2] a # => [:foo] a = [:foo, 'bar', 2] a.pop(50) # => [:foo, "bar", 2] a # => []
Siehe auch: Array#push; siehe auch Methoden zum Löschen.
Fügt die angegebenen objects am Anfang von self ein.
a = [:foo, 'bar', 2] a.unshift(:bam, :bat) # => [:bam, :bat, :foo, "bar", 2]
Siehe auch: Array#shift; siehe auch Methoden zum Zuweisen.
Source
static VALUE
rb_ary_product(int argc, VALUE *argv, VALUE ary)
{
int n = argc+1; /* How many arrays we're operating on */
volatile VALUE t0 = rb_ary_hidden_new(n);
volatile VALUE t1 = Qundef;
VALUE *arrays = RARRAY_PTR(t0); /* The arrays we're computing the product of */
int *counters = ALLOCV_N(int, t1, n); /* The current position in each one */
VALUE result = Qnil; /* The array we'll be returning, when no block given */
long i,j;
long resultlen = 1;
RBASIC_CLEAR_CLASS(t0);
/* initialize the arrays of arrays */
ARY_SET_LEN(t0, n);
arrays[0] = ary;
for (i = 1; i < n; i++) arrays[i] = Qnil;
for (i = 1; i < n; i++) arrays[i] = to_ary(argv[i-1]);
/* initialize the counters for the arrays */
for (i = 0; i < n; i++) counters[i] = 0;
/* Otherwise, allocate and fill in an array of results */
if (rb_block_given_p()) {
/* Make defensive copies of arrays; exit if any is empty */
for (i = 0; i < n; i++) {
if (RARRAY_LEN(arrays[i]) == 0) goto done;
arrays[i] = ary_make_shared_copy(arrays[i]);
}
}
else {
/* Compute the length of the result array; return [] if any is empty */
for (i = 0; i < n; i++) {
long k = RARRAY_LEN(arrays[i]);
if (k == 0) {
result = rb_ary_new2(0);
goto done;
}
if (MUL_OVERFLOW_LONG_P(resultlen, k))
rb_raise(rb_eRangeError, "too big to product");
resultlen *= k;
}
result = rb_ary_new2(resultlen);
}
for (;;) {
int m;
/* fill in one subarray */
VALUE subarray = rb_ary_new2(n);
for (j = 0; j < n; j++) {
rb_ary_push(subarray, rb_ary_entry(arrays[j], counters[j]));
}
/* put it on the result array */
if (NIL_P(result)) {
FL_SET(t0, RARRAY_SHARED_ROOT_FLAG);
rb_yield(subarray);
if (!FL_TEST(t0, RARRAY_SHARED_ROOT_FLAG)) {
rb_raise(rb_eRuntimeError, "product reentered");
}
else {
FL_UNSET(t0, RARRAY_SHARED_ROOT_FLAG);
}
}
else {
rb_ary_push(result, subarray);
}
/*
* Increment the last counter. If it overflows, reset to 0
* and increment the one before it.
*/
m = n-1;
counters[m]++;
while (counters[m] == RARRAY_LEN(arrays[m])) {
counters[m] = 0;
/* If the first counter overflows, we are done */
if (--m < 0) goto done;
counters[m]++;
}
}
done:
ALLOCV_END(t1);
return NIL_P(result) ? ary : result;
}
Berechnet alle Kombinationen von Elementen aus allen Arrays, einschließlich sowohl self als auch other_arrays.
-
Die Anzahl der Kombinationen ist das Produkt der Größen aller Arrays, einschließlich sowohl
selfals auchother_arrays. -
Die Reihenfolge der zurückgegebenen Kombinationen ist unbestimmt.
Ohne Block werden die Kombinationen als Array von Arrays zurückgegeben.
p = [0, 1].product([2, 3]) # => [[0, 2], [0, 3], [1, 2], [1, 3]] p.size # => 4 p = [0, 1].product([2, 3], [4, 5]) # => [[0, 2, 4], [0, 2, 5], [0, 3, 4], [0, 3, 5], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3,... p.size # => 8
Wenn self oder ein Argument leer ist, wird ein leeres Array zurückgegeben.
[].product([2, 3], [4, 5]) # => [] [0, 1].product([2, 3], []) # => []
Wenn kein Argument angegeben ist, werden Arrays mit 1-elementigen Arrays zurückgegeben, die jeweils ein Element von self enthalten.
a.product # => [[0], [1], [2]]
Mit einem Block wird der Block mit jeder Kombination aufgerufen; gibt self zurück.
p = [] [0, 1].product([2, 3]) {|combination| p.push(combination) } p # => [[0, 2], [0, 3], [1, 2], [1, 3]]
Wenn self oder ein Argument leer ist, wird der Block nicht aufgerufen.
[].product([2, 3], [4, 5]) {|combination| fail 'Cannot happen' } # => [] [0, 1].product([2, 3], []) {|combination| fail 'Cannot happen' } # => [0, 1]
Wenn kein Argument angegeben ist, wird der Block mit jedem Element von self als 1-elementiges Array aufgerufen.
p = [] [0, 1].product {|combination| p.push(combination) } p # => [[0], [1]]
Zugehörig: siehe Methoden zum Kombinieren.
Source
static VALUE
rb_ary_push_m(int argc, VALUE *argv, VALUE ary)
{
return rb_ary_cat(ary, argv, argc);
}
Hängt jedes Argument in objekte an self an; gibt self zurück.
a = [:foo, 'bar', 2] # => [:foo, "bar", 2] a.push(:baz, :bat) # => [:foo, "bar", 2, :baz, :bat]
Hängt jedes Argument als einzelnes Element an, auch wenn es ein anderes Array ist.
a = [:foo, 'bar', 2] # => [:foo, "bar", 2] a.push([:baz, :bat], [:bam, :bad]) # => [:foo, "bar", 2, [:baz, :bat], [:bam, :bad]]
Zugehörig: siehe Methoden zum Zuweisen.
Source
VALUE
rb_ary_rassoc(VALUE ary, VALUE value)
{
long i;
VALUE v;
for (i = 0; i < RARRAY_LEN(ary); ++i) {
v = rb_check_array_type(RARRAY_AREF(ary, i));
if (RB_TYPE_P(v, T_ARRAY) &&
RARRAY_LEN(v) > 1 &&
rb_equal(RARRAY_AREF(v, 1), value))
return v;
}
return Qnil;
}
Gibt das erste Element ele in self zurück, für das gilt ele ist ein Array und ele[1] == object.
a = [{foo: 0}, [2, 4], [4, 5, 6], [4, 5]] a.rassoc(4) # => [2, 4] a.rassoc(5) # => [4, 5, 6]
Gibt nil zurück, wenn kein solches Element gefunden wurde.
Siehe auch: Array#assoc; siehe auch Methoden zum Abrufen.
Source
static VALUE
rb_ary_reject(VALUE ary)
{
VALUE rejected_ary;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
rejected_ary = rb_ary_new();
ary_reject(ary, rejected_ary);
return rejected_ary;
}
Mit einem Block wird ein neues Array zurückgegeben, dessen Elemente alle die aus self sind, für die der Block false oder nil zurückgibt.
a = [:foo, 'bar', 2, 'bat'] a1 = a.reject {|element| element.to_s.start_with?('b') } a1 # => [:foo, 2]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Siehe auch: Methoden zum Abrufen.
Source
static VALUE
rb_ary_reject_bang(VALUE ary)
{
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
rb_ary_modify(ary);
return ary_reject_bang(ary);
}
Mit einem Block wird der Block mit jedem Element von self aufgerufen; jedes Element, für das der Block einen truthy Wert zurückgibt, wird entfernt.
Gibt self zurück, wenn Elemente entfernt wurden.
a = [:foo, 'bar', 2, 'bat'] a.reject! {|element| element.to_s.start_with?('b') } # => [:foo, 2]
Gibt nil zurück, wenn keine Elemente entfernt wurden.
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Löschen.
Source
static VALUE
rb_ary_repeated_combination(VALUE ary, VALUE num)
{
long n, i, len;
n = NUM2LONG(num); /* Combination size from argument */
RETURN_SIZED_ENUMERATOR(ary, 1, &num, rb_ary_repeated_combination_size); /* Return enumerator if no block */
len = RARRAY_LEN(ary);
if (n < 0) {
/* yield nothing */
}
else if (n == 0) {
rb_yield(rb_ary_new2(0));
}
else if (n == 1) {
for (i = 0; i < RARRAY_LEN(ary); i++) {
rb_yield(rb_ary_new3(1, RARRAY_AREF(ary, i)));
}
}
else if (len == 0) {
/* yield nothing */
}
else {
volatile VALUE t0;
long *p = ALLOCV_N(long, t0, n);
VALUE ary0 = ary_make_shared_copy(ary); /* private defensive copy of ary */
RBASIC_CLEAR_CLASS(ary0);
rcombinate0(len, n, p, n, ary0); /* compute and yield repeated combinations */
ALLOCV_END(t0);
RBASIC_SET_CLASS_RAW(ary0, rb_cArray);
}
return ary;
}
Mit einem Block wird der Block mit jeder wiederholten Kombination der Länge size der Elemente von self aufgerufen; jede Kombination ist ein Array; gibt self zurück. Die Reihenfolge der Kombinationen ist unbestimmt.
Wenn ein positives ganzzahliges Argument size angegeben ist, wird der Block mit jedem size-Tupel wiederholter Kombination der Elemente von self aufgerufen. Die Anzahl der Kombinationen beträgt (size+1)(size+2)/2.
Beispiele
-
sizeist 1c = [] [0, 1, 2].repeated_combination(1) {|combination| c.push(combination) } c # => [[0], [1], [2]]
-
sizeist 2c = [] [0, 1, 2].repeated_combination(2) {|combination| c.push(combination) } c # => [[0, 0], [0, 1], [0, 2], [1, 1], [1, 2], [2, 2]]
Wenn size null ist, wird der Block einmal mit einem leeren Array aufgerufen.
Wenn size negativ ist, wird der Block nicht aufgerufen.
[0, 1, 2].repeated_combination(-1) {|combination| fail 'Cannot happen' }
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Kombinieren.
Source
static VALUE
rb_ary_repeated_permutation(VALUE ary, VALUE num)
{
long r, n, i;
n = RARRAY_LEN(ary); /* Array length */
RETURN_SIZED_ENUMERATOR(ary, 1, &num, rb_ary_repeated_permutation_size); /* Return Enumerator if no block */
r = NUM2LONG(num); /* Permutation size from argument */
if (r < 0) {
/* no permutations: yield nothing */
}
else if (r == 0) { /* exactly one permutation: the zero-length array */
rb_yield(rb_ary_new2(0));
}
else if (r == 1) { /* this is a special, easy case */
for (i = 0; i < RARRAY_LEN(ary); i++) {
rb_yield(rb_ary_new3(1, RARRAY_AREF(ary, i)));
}
}
else { /* this is the general case */
volatile VALUE t0;
long *p = ALLOCV_N(long, t0, r);
VALUE ary0 = ary_make_shared_copy(ary); /* private defensive copy of ary */
RBASIC_CLEAR_CLASS(ary0);
rpermute0(n, r, p, ary0); /* compute and yield repeated permutations */
ALLOCV_END(t0);
RBASIC_SET_CLASS_RAW(ary0, rb_cArray);
}
return ary;
}
Mit einem Block wird der Block mit jeder wiederholten Permutation der Länge size der Elemente von self aufgerufen; jede Permutation ist ein Array; gibt self zurück. Die Reihenfolge der Permutationen ist unbestimmt.
Wenn ein positives ganzzahliges Argument size angegeben ist, wird der Block mit jedem size-Tupel wiederholter Permutation der Elemente von self aufgerufen. Die Anzahl der Permutationen beträgt self.size**size.
Beispiele
-
sizeist 1p = [] [0, 1, 2].repeated_permutation(1) {|permutation| p.push(permutation) } p # => [[0], [1], [2]]
-
sizeist 2p = [] [0, 1, 2].repeated_permutation(2) {|permutation| p.push(permutation) } p # => [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
Wenn size null ist, wird der Block einmal mit einem leeren Array aufgerufen.
Wenn size negativ ist, wird der Block nicht aufgerufen.
[0, 1, 2].repeated_permutation(-1) {|permutation| fail 'Cannot happen' }
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Kombinieren.
Ersetzt die Elemente von self durch die Elemente von anderes_array, das ein array-konvertierbares Objekt sein muss; gibt self zurück.
a = ['a', 'b', 'c'] # => ["a", "b", "c"] a.replace(['d', 'e']) # => ["d", "e"]
Zugehörig: siehe Methoden zum Zuweisen.
Source
static VALUE
rb_ary_reverse_m(VALUE ary)
{
long len = RARRAY_LEN(ary);
VALUE dup = rb_ary_new2(len);
if (len > 0) {
const VALUE *p1 = RARRAY_CONST_PTR(ary);
VALUE *p2 = (VALUE *)RARRAY_CONST_PTR(dup) + len - 1;
do *p2-- = *p1++; while (--len > 0);
}
ARY_SET_LEN(dup, RARRAY_LEN(ary));
return dup;
}
Gibt ein neues Array zurück, das die Elemente von self in umgekehrter Reihenfolge enthält.
[0, 1, 2].reverse # => [2, 1, 0]
Zugehörig: siehe Methoden zum Kombinieren.
Source
static VALUE
rb_ary_reverse_bang(VALUE ary)
{
return rb_ary_reverse(ary);
}
Kehrt die Reihenfolge der Elemente von self um; gibt self zurück.
a = [0, 1, 2] a.reverse! # => [2, 1, 0] a # => [2, 1, 0]
Zugehörig: siehe Methoden zum Zuweisen.
Source
static VALUE
rb_ary_reverse_each(VALUE ary)
{
long len;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
len = RARRAY_LEN(ary);
while (len--) {
long nlen;
rb_yield(RARRAY_AREF(ary, len));
nlen = RARRAY_LEN(ary);
if (nlen < len) {
len = nlen;
}
}
return ary;
}
Wenn ein Block angegeben ist, iteriert rückwärts über die Elemente von self, übergibt jedes Element in umgekehrter Reihenfolge an den Block; gibt self zurück.
a = [] [0, 1, 2].reverse_each {|element| a.push(element) } a # => [2, 1, 0]
Ermöglicht die Änderung des Arrays während der Iteration.
a = ['a', 'b', 'c'] a.reverse_each {|element| a.clear if element.start_with?('b') } a # => []
Wenn kein Block angegeben ist, wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Iterieren.
Source
static VALUE
rb_ary_rfind(int argc, VALUE *argv, VALUE ary)
{
VALUE if_none;
long len, idx;
RETURN_ENUMERATOR(ary, argc, argv);
if_none = rb_check_arity(argc, 0, 1) ? argv[0] : Qnil;
idx = RARRAY_LEN(ary);
while (idx--) {
VALUE elem = RARRAY_AREF(ary, idx);
if (RTEST(rb_yield(elem))) {
return elem;
}
len = RARRAY_LEN(ary);
idx = (idx >= len) ? len : idx;
}
if (!NIL_P(if_none)) {
return rb_funcallv(if_none, idCall, 0, 0);
}
return Qnil;
}
Gibt das letzte Element zurück, für das der Block einen truthy Wert zurückgibt.
Mit einem Block wird der Block mit sukzessiven Elementen des Arrays in umgekehrter Reihenfolge aufgerufen; gibt das erste Element zurück, für das der Block einen truthy Wert zurückgibt.
[1, 2, 3, 4, 5, 6].rfind {|element| element < 5} # => 4
Wenn kein solches Element gefunden wird, wird falls_nicht_gefunden_proc aufgerufen und dessen Rückgabewert zurückgegeben.
[1, 2, 3, 4].rfind(proc {0}) {|element| element < -2} # => 0
Ohne Block wird ein Enumerator zurückgegeben.
Source
static VALUE
rb_ary_rindex(int argc, VALUE *argv, VALUE ary)
{
VALUE val;
long i = RARRAY_LEN(ary), len;
if (argc == 0) {
RETURN_ENUMERATOR(ary, 0, 0);
while (i--) {
if (RTEST(rb_yield(RARRAY_AREF(ary, i))))
return LONG2NUM(i);
if (i > (len = RARRAY_LEN(ary))) {
i = len;
}
}
return Qnil;
}
rb_check_arity(argc, 0, 1);
val = argv[0];
if (rb_block_given_p())
rb_warn("given block not used");
while (i--) {
VALUE e = RARRAY_AREF(ary, i);
if (rb_equal(e, val)) {
return LONG2NUM(i);
}
if (i > RARRAY_LEN(ary)) {
break;
}
}
return Qnil;
}
Gibt den Index des letzten Elements zurück, für das gilt object == element.
Mit dem Argument object wird der Index des letzten gefundenen Elements zurückgegeben.
a = [:foo, 'bar', 2, 'bar'] a.rindex('bar') # => 3
Gibt nil zurück, wenn kein solches Objekt gefunden wurde.
Mit einem Block wird der Block mit jedem sukzessiven Element aufgerufen; gibt den Index des letzten Elements zurück, für das der Block einen truthy Wert zurückgibt.
a = [:foo, 'bar', 2, 'bar'] a.rindex {|element| element == 'bar' } # => 3
Gibt nil zurück, wenn der Block niemals einen wahrheitsgemäßen Wert zurückgibt.
Wenn weder ein Argument noch ein Block gegeben ist, wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zur Abfrage.
Source
static VALUE
rb_ary_rotate_m(int argc, VALUE *argv, VALUE ary)
{
VALUE rotated;
const VALUE *ptr;
long len;
long cnt = (rb_check_arity(argc, 0, 1) ? NUM2LONG(argv[0]) : 1);
len = RARRAY_LEN(ary);
rotated = rb_ary_new2(len);
if (len > 0) {
cnt = rotate_count(cnt, len);
ptr = RARRAY_CONST_PTR(ary);
len -= cnt;
ary_memcpy(rotated, 0, len, ptr + cnt);
ary_memcpy(rotated, len, cnt, ptr);
}
ARY_SET_LEN(rotated, RARRAY_LEN(ary));
return rotated;
}
Gibt ein neues Array zurück, das aus self mit von einem Ende zum anderen rotierten Elementen gebildet wird.
Mit einem nicht-negativen numerischen count werden Elemente vom Anfang zum Ende rotiert.
[0, 1, 2, 3].rotate(2) # => [2, 3, 0, 1] [0, 1, 2, 3].rotate(2.1) # => [2, 3, 0, 1]
Wenn count groß ist, wird count % array.size als Anzahl verwendet.
[0, 1, 2, 3].rotate(22) # => [2, 3, 0, 1]
Bei einem count von Null werden keine Elemente rotiert.
[0, 1, 2, 3].rotate(0) # => [0, 1, 2, 3]
Mit einem negativen numerischen count wird in die entgegengesetzte Richtung rotiert, vom Ende zum Anfang.
[0, 1, 2, 3].rotate(-1) # => [3, 0, 1, 2]
Wenn count klein ist (weit von Null entfernt), wird count % array.size als Anzahl verwendet.
[0, 1, 2, 3].rotate(-21) # => [3, 0, 1, 2]
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_rotate_bang(int argc, VALUE *argv, VALUE ary)
{
long n = (rb_check_arity(argc, 0, 1) ? NUM2LONG(argv[0]) : 1);
rb_ary_rotate(ary, n);
return ary;
}
Rotiert self an Ort und Stelle, indem Elemente von einem Ende zum anderen verschoben werden; gibt self zurück.
Mit einem nicht-negativen numerischen count werden count Elemente vom Anfang zum Ende rotiert.
[0, 1, 2, 3].rotate!(2) # => [2, 3, 0, 1] [0, 1, 2, 3].rotate!(2.1) # => [2, 3, 0, 1]
Wenn count groß ist, wird count % array.size als Anzahl verwendet.
[0, 1, 2, 3].rotate!(21) # => [1, 2, 3, 0]
Wenn count null ist, werden keine Elemente rotiert.
[0, 1, 2, 3].rotate!(0) # => [0, 1, 2, 3]
Mit einem negativen numerischen count wird in die entgegengesetzte Richtung rotiert, vom Ende zum Anfang.
[0, 1, 2, 3].rotate!(-1) # => [3, 0, 1, 2]
Wenn count klein ist (weit von Null entfernt), wird count % array.size als Anzahl verwendet.
[0, 1, 2, 3].rotate!(-21) # => [3, 0, 1, 2]
Zugehörig: siehe Methoden zum Zuweisen.
Source
# File array.rb, line 95 def sample(n = (ary = false), random: Random) if Primitive.mandatory_only? # Primitive.cexpr! %{ rb_ary_sample(self, rb_cRandom, Qfalse, Qfalse) } Primitive.ary_sample0 else # Primitive.cexpr! %{ rb_ary_sample(self, random, n, ary) } Primitive.ary_sample(random, n, ary) end end
Gibt zufällige Elemente aus self zurück, wie sie vom Objekt ausgewählt wurden, das durch das Schlüsselwortargument random angegeben wird.
Ohne das Argument count wird ein zufälliges Element aus self zurückgegeben.
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] a.sample # => 3 a.sample # => 8
Gibt nil zurück, wenn self leer ist.
[].sample # => nil
Mit einem nicht-negativen numerischen Argument count wird ein neues Array zurückgegeben, das count zufällige Elemente aus self enthält.
a.sample(3) # => [8, 9, 2] a.sample(6) # => [9, 6, 0, 3, 1, 4]
Die Reihenfolge des Ergebnis-Arrays hat keinen Bezug zur Reihenfolge von self.
Gibt ein neues leeres Array zurück, wenn self leer ist.
[].sample(4) # => []
Kann Duplikate in self zurückgeben.
a = [1, 1, 1, 2, 2, 3] a.sample(a.size) # => [1, 1, 3, 2, 1, 2]
Gibt nicht mehr als a.size Elemente zurück (da keine neuen Duplikate eingeführt werden).
a.sample(50) # => [6, 4, 1, 8, 5, 9, 0, 2, 3, 7]
Das mit dem Schlüsselwortargument random angegebene Objekt wird als Zufallszahlengenerator verwendet.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] a.sample(random: Random.new(1)) # => 6 a.sample(4, random: Random.new(1)) # => [6, 10, 9, 2]
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_select(VALUE ary)
{
VALUE result;
long i;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
result = rb_ary_new2(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) {
rb_ary_push(result, rb_ary_elt(ary, i));
}
}
return result;
}
Mit einem Block wird der Block mit jedem Element von self aufgerufen; es wird ein neues Array zurückgegeben, das die Elemente von self enthält, für die der Block einen wahrheitsgemäßen Wert zurückgibt.
a = [:foo, 'bar', 2, :bam] a.select {|element| element.to_s.start_with?('b') } # => ["bar", :bam]
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_select_bang(VALUE ary)
{
struct select_bang_arg args;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
rb_ary_modify(ary);
args.ary = ary;
args.len[0] = args.len[1] = 0;
return rb_ensure(select_bang_i, (VALUE)&args, select_bang_ensure, (VALUE)&args);
}
Mit einem Block wird der Block mit jedem Element von self aufgerufen; Elemente werden aus self entfernt, wenn der Block false oder nil zurückgibt.
Gibt self zurück, wenn Elemente entfernt wurden.
a = [:foo, 'bar', 2, :bam] a.select! {|element| element.to_s.start_with?('b') } # => ["bar", :bam]
Gibt nil zurück, wenn keine Elemente entfernt wurden.
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Löschen.
Source
# File lib/shellwords.rb, line 251 def shelljoin Shellwords.join(self) end
Erstellt einen Befehlszeilenstring aus einer Argumentliste array, wobei alle Elemente für die Bourne-Shell maskiert und durch ein Leerzeichen getrennt werden.
Details finden Sie unter Shellwords.shelljoin.
Source
static VALUE
rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
{
VALUE result;
long n;
if (argc == 0) {
return rb_ary_shift(ary);
}
rb_ary_modify_check(ary);
result = ary_take_first_or_last(argc, argv, ary, ARY_TAKE_FIRST);
n = RARRAY_LEN(result);
rb_ary_behead(ary,n);
return result;
}
Entfernt und gibt führende Elemente aus self zurück.
Ohne Argument wird ein Element entfernt und zurückgegeben, falls vorhanden, sonst nil.
a = [0, 1, 2, 3] a.shift # => 0 a # => [1, 2, 3] [].shift # => nil
Mit einem nicht-negativen numerischen Argument count werden die ersten count Elemente entfernt und zurückgegeben.
a = [0, 1, 2, 3] a.shift(2) # => [0, 1] a # => [2, 3] a.shift(1.1) # => [2] a # => [3] a.shift(0) # => [] a # => [3]
Wenn count groß ist, werden alle Elemente entfernt und zurückgegeben.
a = [0, 1, 2, 3] a.shift(50) # => [0, 1, 2, 3] a # => []
Wenn self leer ist, wird ein neues leeres Array zurückgegeben.
Zugehörig: siehe Methoden zum Löschen.
Source
# File array.rb, line 45 def shuffle(random: Random) Primitive.rb_ary_shuffle(random) end
Gibt ein neues Array zurück, das alle Elemente aus self in zufälliger Reihenfolge enthält, wie sie vom Objekt ausgewählt wurden, das durch das Schlüsselwortargument random angegeben wird.
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] a.shuffle # => [0, 8, 1, 9, 6, 3, 4, 7, 2, 5] a.shuffle # => [8, 9, 0, 5, 1, 2, 6, 4, 7, 3]
Duplikate sind enthalten.
a = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1] a.shuffle # => [1, 0, 1, 1, 0, 0, 1, 0, 0, 1] a.shuffle # => [1, 1, 0, 0, 0, 1, 1, 0, 0, 1]
Das mit dem Schlüsselwortargument random angegebene Objekt wird als Zufallszahlengenerator verwendet.
Zugehörig: siehe Methoden zum Abrufen.
Source
# File array.rb, line 22 def shuffle!(random: Random) Primitive.rb_ary_shuffle_bang(random) end
Mischt alle Elemente in self in zufälliger Reihenfolge, wie sie vom Objekt ausgewählt wurden, das durch das Schlüsselwortargument random angegeben wird. Gibt self zurück.
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] a.shuffle! # => [5, 3, 8, 7, 6, 1, 9, 4, 2, 0] a.shuffle! # => [9, 4, 0, 6, 2, 8, 1, 5, 3, 7]
Duplikate sind enthalten.
a = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1] a.shuffle! # => [1, 0, 0, 1, 1, 0, 1, 0, 0, 1] a.shuffle! # => [0, 1, 0, 1, 1, 0, 1, 0, 1, 0]
Das mit dem Schlüsselwortargument random angegebene Objekt wird als Zufallszahlengenerator verwendet.
Zugehörig: siehe Methoden zum Zuweisen.
Gibt die Anzahl der Elemente in self zurück.
[0, 1, 2].length # => 3 [].length # => 0
Zugehörig: siehe Methoden zur Abfrage.
Gibt Elemente aus self zurück; ändert self nicht.
Kurz gesagt:
a = [:foo, 'bar', 2] # Single argument index: returns one element. a[0] # => :foo # Zero-based index. a[-1] # => 2 # Negative index counts backwards from end. # Arguments start and length: returns an array. a[1, 2] # => ["bar", 2] a[-2, 2] # => ["bar", 2] # Negative start counts backwards from end. # Single argument range: returns an array. a[0..1] # => [:foo, "bar"] a[0..-2] # => [:foo, "bar"] # Negative range-begin counts backwards from end. a[-2..2] # => ["bar", 2] # Negative range-end counts backwards from end.
Wenn ein einzelnes Ganzzahlargument index gegeben wird, wird das Element am Offset index zurückgegeben.
a = [:foo, 'bar', 2] a[0] # => :foo a[2] # => 2 a # => [:foo, "bar", 2]
Wenn index negativ ist, zählt es vom Ende von self rückwärts.
a = [:foo, 'bar', 2] a[-1] # => 2 a[-2] # => "bar"
Wenn index außerhalb des Bereichs liegt, wird nil zurückgegeben.
Wenn zwei Integer-Argumente start und length gegeben werden, wird ein neues Array der Größe length mit aufeinanderfolgenden Elementen zurückgegeben, beginnend bei Offset start.
a = [:foo, 'bar', 2] a[0, 2] # => [:foo, "bar"] a[1, 2] # => ["bar", 2]
Wenn start + length größer als self.length ist, werden alle Elemente von Offset start bis zum Ende zurückgegeben.
a = [:foo, 'bar', 2] a[0, 4] # => [:foo, "bar", 2] a[1, 3] # => ["bar", 2] a[2, 2] # => [2]
Wenn start == self.size und length >= 0, wird ein neues leeres Array zurückgegeben.
Wenn length negativ ist, wird nil zurückgegeben.
Wenn ein einzelnes Range-Argument range gegeben wird, werden range.min als start oben und range.size als length oben behandelt.
a = [:foo, 'bar', 2] a[0..1] # => [:foo, "bar"] a[1..2] # => ["bar", 2]
Sonderfall: Wenn range.start == a.size, wird ein neues leeres Array zurückgegeben.
Wenn range.end negativ ist, wird der Endindex vom Ende berechnet.
a = [:foo, 'bar', 2] a[0..-1] # => [:foo, "bar", 2] a[0..-2] # => [:foo, "bar"] a[0..-3] # => [:foo]
Wenn range.start negativ ist, wird der Startindex vom Ende berechnet.
a = [:foo, 'bar', 2] a[-1..2] # => [2] a[-2..2] # => ["bar", 2] a[-3..2] # => [:foo, "bar", 2]
Wenn range.start größer als die Array-Größe ist, wird nil zurückgegeben.
a = [:foo, 'bar', 2] a[4..1] # => nil a[4..0] # => nil a[4..-1] # => nil
Wenn ein einzelnes Enumerator::ArithmeticSequence-Argument aseq gegeben wird, wird ein Array von Elementen zurückgegeben, die den vom Sequenz erzeugten Indizes entsprechen.
a = ['--', 'data1', '--', 'data2', '--', 'data3'] a[(1..).step(2)] # => ["data1", "data2", "data3"]
Im Gegensatz zum Slicing mit einem Bereich wirft es einen RangeError, wenn der Anfang oder das Ende der arithmetischen Sequenz größer als die Array-Größe ist.
a = ['--', 'data1', '--', 'data2', '--', 'data3'] a[(1..11).step(2)] # RangeError (((1..11).step(2)) out of range) a[(7..).step(2)] # RangeError (((7..).step(2)) out of range)
Wenn ein einzelnes Argument übergeben wird und dessen Typ nicht zu den aufgeführten gehört, wird versucht, es in einen Integer zu konvertieren. Wenn dies nicht möglich ist, wird ein Fehler ausgelöst.
a = [:foo, 'bar', 2] # Raises TypeError (no implicit conversion of Symbol into Integer): a[:foo]
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_slice_bang(int argc, VALUE *argv, VALUE ary)
{
VALUE arg1;
long pos, len;
rb_ary_modify_check(ary);
rb_check_arity(argc, 1, 2);
arg1 = argv[0];
if (argc == 2) {
pos = NUM2LONG(argv[0]);
len = NUM2LONG(argv[1]);
return ary_slice_bang_by_rb_ary_splice(ary, pos, len);
}
if (!FIXNUM_P(arg1)) {
switch (rb_range_beg_len(arg1, &pos, &len, RARRAY_LEN(ary), 0)) {
case Qtrue:
/* valid range */
return ary_slice_bang_by_rb_ary_splice(ary, pos, len);
case Qnil:
/* invalid range */
return Qnil;
default:
/* not a range */
break;
}
}
return rb_ary_delete_at(ary, NUM2LONG(arg1));
}
Entfernt und gibt Elemente aus self zurück.
Mit einem numerischen Argument index wird das Element am Offset index entfernt und zurückgegeben.
a = ['a', 'b', 'c', 'd'] a.slice!(2) # => "c" a # => ["a", "b", "d"] a.slice!(2.1) # => "d" a # => ["a", "b"]
Wenn index negativ ist, zählt es vom Ende von self rückwärts.
a = ['a', 'b', 'c', 'd'] a.slice!(-2) # => "c" a # => ["a", "b", "d"]
Wenn index außerhalb des Bereichs liegt, wird nil zurückgegeben.
Mit den numerischen Argumenten start und length werden length Elemente aus self ab dem nullbasierten Offset start entfernt; die entfernten Objekte werden in einem neuen Array zurückgegeben.
a = ['a', 'b', 'c', 'd'] a.slice!(1, 2) # => ["b", "c"] a # => ["a", "d"] a.slice!(0.1, 1.1) # => ["a"] a # => ["d"]
Wenn start negativ ist, wird vom Ende von self rückwärts gezählt.
a = ['a', 'b', 'c', 'd'] a.slice!(-2, 1) # => ["c"] a # => ["a", "b", "d"]
Wenn start außerhalb des Bereichs liegt, wird nil zurückgegeben.
a = ['a', 'b', 'c', 'd'] a.slice!(5, 1) # => nil a.slice!(-5, 1) # => nil
Wenn start + length die Array-Größe überschreitet, werden alle Elemente ab dem Offset start bis zum Ende entfernt und zurückgegeben.
a = ['a', 'b', 'c', 'd'] a.slice!(2, 50) # => ["c", "d"] a # => ["a", "b"]
Wenn start == a.size und length nicht-negativ ist, wird ein neues leeres Array zurückgegeben.
Wenn length negativ ist, wird nil zurückgegeben.
Mit einem Range-Argument range wird range.min als start (wie oben) und range.size als length (wie oben) behandelt.
a = ['a', 'b', 'c', 'd'] a.slice!(1..2) # => ["b", "c"] a # => ["a", "d"]
Wenn range.start == a.size, wird ein neues leeres Array zurückgegeben.
a = ['a', 'b', 'c', 'd'] a.slice!(4..5) # => []
Wenn range.start größer als die Array-Größe ist, wird nil zurückgegeben.
a = ['a', 'b', 'c', 'd'] a.slice!(5..6) # => nil
Wenn range.start negativ ist, wird der Startindex durch Rückwärtszählen vom Ende von self berechnet.
a = ['a', 'b', 'c', 'd'] a.slice!(-2..2) # => ["c"]
Wenn range.end negativ ist, wird der Endindex durch Rückwärtszählen vom Ende von self berechnet.
a = ['a', 'b', 'c', 'd'] a.slice!(0..-2) # => ["a", "b", "c"]
Zugehörig: siehe Methoden zum Löschen.
Source
VALUE
rb_ary_sort(VALUE ary)
{
ary = rb_ary_dup(ary);
rb_ary_sort_bang(ary);
return ary;
}
Gibt ein neues Array zurück, das die sortierten Elemente von self enthält.
Ohne Block werden die Elemente mithilfe des Operators <=> (siehe Object#<=>) verglichen.
[0, 2, 3, 1].sort # => [0, 1, 2, 3]
Mit einem Block wird der Block mit jeder Kombination von Paaren von Elementen aus self aufgerufen; für jedes Paar a und b sollte der Block eine Zahl zurückgeben.
-
Negativ, wenn
bnachafolgen soll. -
Null, wenn
aundbäquivalent sind. -
Positiv, wenn
anachbfolgen soll.
Beispiel
a = [3, 2, 0, 1] a.sort {|a, b| a <=> b } # => [0, 1, 2, 3] a.sort {|a, b| b <=> a } # => [3, 2, 1, 0]
Wenn der Block Null zurückgibt, ist die Reihenfolge für a und b unbestimmt und kann instabil sein.
Ein Beispiel für die Idiomatik zum Sortieren komplexerer Strukturen finden Sie unter Numeric#nonzero?.
Zugehörig: siehe Methoden zum Abrufen.
Source
VALUE
rb_ary_sort_bang(VALUE ary)
{
rb_ary_modify(ary);
RUBY_ASSERT(!ARY_SHARED_P(ary));
if (RARRAY_LEN(ary) > 1) {
VALUE tmp = ary_make_substitution(ary); /* only ary refers tmp */
struct ary_sort_data data;
long len = RARRAY_LEN(ary);
RBASIC_CLEAR_CLASS(tmp);
data.ary = tmp;
data.receiver = ary;
RARRAY_PTR_USE(tmp, ptr, {
ruby_qsort(ptr, len, sizeof(VALUE),
rb_block_given_p()?sort_1:sort_2, &data);
}); /* WB: no new reference */
rb_ary_modify(ary);
if (ARY_EMBED_P(tmp)) {
if (ARY_SHARED_P(ary)) { /* ary might be destructively operated in the given block */
rb_ary_unshare(ary);
FL_SET_EMBED(ary);
}
if (ARY_EMBED_LEN(tmp) > ARY_CAPA(ary)) {
ary_resize_capa(ary, ARY_EMBED_LEN(tmp));
}
ary_memcpy(ary, 0, ARY_EMBED_LEN(tmp), ARY_EMBED_PTR(tmp));
ARY_SET_LEN(ary, ARY_EMBED_LEN(tmp));
}
else {
if (!ARY_EMBED_P(ary) && ARY_HEAP_PTR(ary) == ARY_HEAP_PTR(tmp)) {
FL_UNSET_SHARED(ary);
ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
}
else {
RUBY_ASSERT(!ARY_SHARED_P(tmp));
if (ARY_EMBED_P(ary)) {
FL_UNSET_EMBED(ary);
}
else if (ARY_SHARED_P(ary)) {
/* ary might be destructively operated in the given block */
rb_ary_unshare(ary);
}
else {
ary_heap_free(ary);
}
ARY_SET_PTR(ary, ARY_HEAP_PTR(tmp));
ARY_SET_HEAP_LEN(ary, len);
ARY_SET_CAPA(ary, ARY_HEAP_LEN(tmp));
}
/* tmp was lost ownership for the ptr */
FL_SET_EMBED(tmp);
ARY_SET_EMBED_LEN(tmp, 0);
OBJ_FREEZE(tmp);
}
/* tmp will be GC'ed. */
RBASIC_SET_CLASS_RAW(tmp, rb_cArray); /* rb_cArray must be marked */
}
ary_verify(ary);
return ary;
}
Wie Array#sort, gibt aber self mit seinen sortierten Elementen an Ort und Stelle zurück.
Zugehörig: siehe Methoden zum Zuweisen.
Source
static VALUE
rb_ary_sort_by_bang(VALUE ary)
{
VALUE sorted;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
rb_ary_modify(ary);
if (RARRAY_LEN(ary) > 1) {
sorted = rb_block_call(ary, rb_intern("sort_by"), 0, 0, sort_by_i, 0);
rb_ary_replace(ary, sorted);
}
return ary;
}
Mit einem Block werden die Elemente von self an Ort und Stelle sortiert; gibt self zurück.
Ruft den Block mit jedem sukzessiven Element auf; sortiert Elemente basierend auf den vom Block zurückgegebenen Werten.
a = ['aaaa', 'bbb', 'cc', 'd'] a.sort_by! {|element| element.size } a # => ["d", "cc", "bbb", "aaaa"]
Bei doppelten Werten, die vom Block zurückgegeben werden, ist die Reihenfolge unbestimmt und kann instabil sein.
Ohne Block wird ein neuer Enumerator zurückgegeben.
Zugehörig: siehe Methoden zum Zuweisen.
Source
static VALUE
rb_ary_sum(int argc, VALUE *argv, VALUE ary)
{
VALUE e, v, r;
long i, n;
int block_given;
v = (rb_check_arity(argc, 0, 1) ? argv[0] : LONG2FIX(0));
block_given = rb_block_given_p();
if (RARRAY_LEN(ary) == 0)
return v;
n = 0;
r = Qundef;
if (!FIXNUM_P(v) && !RB_BIGNUM_TYPE_P(v) && !RB_TYPE_P(v, T_RATIONAL)) {
i = 0;
goto init_is_a_value;
}
for (i = 0; i < RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
if (block_given)
e = rb_yield(e);
if (FIXNUM_P(e)) {
n += FIX2LONG(e); /* should not overflow long type */
if (!FIXABLE(n)) {
v = rb_big_plus(LONG2NUM(n), v);
n = 0;
}
}
else if (RB_BIGNUM_TYPE_P(e))
v = rb_big_plus(e, v);
else if (RB_TYPE_P(e, T_RATIONAL)) {
if (UNDEF_P(r))
r = e;
else
r = rb_rational_plus(r, e);
}
else
goto not_exact;
}
v = finish_exact_sum(n, r, v, argc!=0);
return v;
not_exact:
v = finish_exact_sum(n, r, v, i!=0);
if (RB_FLOAT_TYPE_P(e)) {
/*
* Kahan-Babuska balancing compensated summation algorithm
* See https://link.springer.com/article/10.1007/s00607-005-0139-x
*/
double f, c;
double x, t;
f = NUM2DBL(v);
c = 0.0;
goto has_float_value;
for (; i < RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
if (block_given)
e = rb_yield(e);
if (RB_FLOAT_TYPE_P(e))
has_float_value:
x = RFLOAT_VALUE(e);
else if (FIXNUM_P(e))
x = FIX2LONG(e);
else if (RB_BIGNUM_TYPE_P(e))
x = rb_big2dbl(e);
else if (RB_TYPE_P(e, T_RATIONAL))
x = rb_num2dbl(e);
else
goto not_float;
if (isnan(f)) continue;
if (isnan(x)) {
f = x;
continue;
}
if (isinf(x)) {
if (isinf(f) && signbit(x) != signbit(f))
f = NAN;
else
f = x;
continue;
}
if (isinf(f)) continue;
t = f + x;
if (fabs(f) >= fabs(x))
c += ((f - t) + x);
else
c += ((x - t) + f);
f = t;
}
f += c;
return DBL2NUM(f);
not_float:
v = DBL2NUM(f);
}
goto has_some_value;
init_is_a_value:
for (; i < RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
if (block_given)
e = rb_yield(e);
has_some_value:
v = rb_funcall(v, idPLUS, 1, e);
}
return v;
}
Ohne Block wird die Summe von init und allen Elementen von self zurückgegeben; für das Array array und den Wert init ist dies äquivalent zu.
sum = init array.each {|element| sum += element } sum
Zum Beispiel gibt [e0, e1, e2].sum init + e0 + e1 + e2 zurück.
Beispiele
[0, 1, 2, 3].sum # => 6 [0, 1, 2, 3].sum(100) # => 106 ['abc', 'def', 'ghi'].sum('jkl') # => "jklabcdefghi" [[:foo, :bar], ['foo', 'bar']].sum([2, 3]) # => [2, 3, :foo, :bar, "foo", "bar"]
Der Wert init und die Elemente müssen keine Zahlen sein, aber alle müssen mit + kompatibel sein.
# Raises TypeError: Array can't be coerced into Integer. [[:foo, :bar], ['foo', 'bar']].sum(2)
Mit einem Block wird der Block mit jedem Element von self aufgerufen; der Rückgabewert des Blocks (anstelle des Elements selbst) wird als Summand verwendet.
['zero', 1, :two].sum('Coerced and concatenated: ') {|element| element.to_s } # => "Coerced and concatenated: zero1two"
Hinweise
-
Array#joinundArray#flattenkönnen für ein Array von Strings oder ein Array von Arrays schneller sein alsArray#sum. -
Die Methode
Array#sumberücksichtigt möglicherweise keine Methodenneudefinitionen von „+“-Methoden wieInteger#+.
Source
static VALUE
rb_ary_take(VALUE obj, VALUE n)
{
long len = NUM2LONG(n);
if (len < 0) {
rb_raise(rb_eArgError, "attempt to take negative size");
}
return rb_ary_subseq(obj, 0, len);
}
Gibt ein neues Array zurück, das die ersten count Elemente von self (falls verfügbar) enthält; count muss eine nicht-negative Zahl sein; self wird nicht modifiziert.
a = ['a', 'b', 'c', 'd'] a.take(2) # => ["a", "b"] a.take(2.1) # => ["a", "b"] a.take(50) # => ["a", "b", "c", "d"] a.take(0) # => []
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_take_while(VALUE ary)
{
long i;
RETURN_ENUMERATOR(ary, 0, 0);
for (i = 0; i < RARRAY_LEN(ary); i++) {
if (!RTEST(rb_yield(RARRAY_AREF(ary, i)))) break;
}
return rb_ary_take(ary, LONG2FIX(i));
}
Mit einem Block wird der Block mit jedem sukzessiven Element von self aufgerufen; die Iteration stoppt, wenn der Block false oder nil zurückgibt; gibt ein neues Array zurück, das die Elemente enthält, für die der Block einen truthy Wert zurückgegeben hat.
a = [0, 1, 2, 3, 4, 5] a.take_while {|element| element < 3 } # => [0, 1, 2] a.take_while {|element| true } # => [0, 1, 2, 3, 4, 5] a.take_while {|element| false } # => []
Ohne Block wird ein neuer Enumerator zurückgegeben.
Modifiziert self nicht.
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_to_a(VALUE ary)
{
if (rb_obj_class(ary) != rb_cArray) {
VALUE dup = rb_ary_new2(RARRAY_LEN(ary));
rb_ary_replace(dup, ary);
return dup;
}
return ary;
}
Wenn self eine Instanz von Array ist, wird self zurückgegeben.
Andernfalls wird ein neues Array zurückgegeben, das die Elemente von self enthält.
class MyArray < Array; end my_a = MyArray.new(['foo', 'bar', 'two']) a = my_a.to_a a # => ["foo", "bar", "two"] a.class # => Array # Not MyArray.
Zugehörig: siehe Methoden zur Konvertierung.
Source
static VALUE
rb_ary_to_h(VALUE ary)
{
long i;
VALUE hash = rb_hash_new_with_size(RARRAY_LEN(ary));
int block_given = rb_block_given_p();
for (i=0; i<RARRAY_LEN(ary); i++) {
const VALUE e = rb_ary_elt(ary, i);
const VALUE elt = block_given ? rb_yield_force_blockarg(e) : e;
const VALUE key_value_pair = rb_check_array_type(elt);
if (NIL_P(key_value_pair)) {
rb_raise(rb_eTypeError, "wrong element type %"PRIsVALUE" at %ld (expected array)",
rb_obj_class(elt), i);
}
if (RARRAY_LEN(key_value_pair) != 2) {
rb_raise(rb_eArgError, "wrong array length at %ld (expected 2, was %ld)",
i, RARRAY_LEN(key_value_pair));
}
rb_hash_aset(hash, RARRAY_AREF(key_value_pair, 0), RARRAY_AREF(key_value_pair, 1));
}
return hash;
}
Gibt einen neuen Hash zurück, der aus self gebildet wird.
Ohne Block muss jedes Element von self ein 2-elementiges Unterarray sein; bildet jedes Unterarray zu einem Schlüssel-Wert-Paar im neuen Hash.
a = [['foo', 'zero'], ['bar', 'one'], ['baz', 'two']] a.to_h # => {"foo"=>"zero", "bar"=>"one", "baz"=>"two"} [].to_h # => {}
Mit einem Block muss der Block ein 2-elementiges Array zurückgeben; ruft den Block mit jedem Element von self auf; bildet jedes zurückgegebene Array zu einem Schlüssel-Wert-Paar im zurückgegebenen Hash.
a = ['foo', :bar, 1, [2, 3], {baz: 4}] a.to_h {|element| [element, element.class] } # => {"foo"=>String, :bar=>Symbol, 1=>Integer, [2, 3]=>Array, {:baz=>4}=>Hash}
Zugehörig: siehe Methoden zur Konvertierung.
Gibt die neue Zeichenkette zurück, die durch Aufrufen der Methode inspect für jedes Array-Element gebildet wird.
a = [:foo, 'bar', 2] a.inspect # => "[:foo, \"bar\", 2]"
Zugehörig: siehe Methoden zur Konvertierung.
Source
static VALUE
rb_ary_transpose(VALUE ary)
{
long elen = -1, alen, i, j;
VALUE tmp, result = 0;
alen = RARRAY_LEN(ary);
if (alen == 0) return rb_ary_dup(ary);
for (i=0; i<alen; i++) {
tmp = to_ary(rb_ary_elt(ary, i));
if (elen < 0) { /* first element */
elen = RARRAY_LEN(tmp);
result = rb_ary_new2(elen);
for (j=0; j<elen; j++) {
rb_ary_store(result, j, rb_ary_new2(alen));
}
}
else if (elen != RARRAY_LEN(tmp)) {
rb_raise(rb_eIndexError, "element size differs (%ld should be %ld)",
RARRAY_LEN(tmp), elen);
}
for (j=0; j<elen; j++) {
rb_ary_store(rb_ary_elt(result, j), i, rb_ary_elt(tmp, j));
}
}
return result;
}
Gibt ein neues Array zurück, das self als transponierte Matrix darstellt.
a = [[:a0, :a1], [:b0, :b1], [:c0, :c1]] a.transpose # => [[:a0, :b0, :c0], [:a1, :b1, :c1]]
Die Elemente von self müssen alle die gleiche Größe haben.
Zugehörig: siehe Methoden zur Konvertierung.
Source
static VALUE
rb_ary_union_multi(int argc, VALUE *argv, VALUE ary)
{
int i;
long sum;
VALUE hash;
sum = RARRAY_LEN(ary);
for (i = 0; i < argc; i++) {
argv[i] = to_ary(argv[i]);
sum += RARRAY_LEN(argv[i]);
}
if (sum <= SMALL_ARRAY_LEN) {
VALUE ary_union = rb_ary_new();
rb_ary_union(ary_union, ary);
for (i = 0; i < argc; i++) rb_ary_union(ary_union, argv[i]);
return ary_union;
}
hash = ary_make_hash(ary);
for (i = 0; i < argc; i++) rb_ary_union_hash(hash, argv[i]);
return rb_hash_values(hash);
}
Gibt ein neues Array zurück, das die Vereinigung der Elemente von self und aller gegebenen Arrays other_arrays ist; Elemente werden mit eql? verglichen.
[0, 1, 2, 3].union([4, 5], [6, 7]) # => [0, 1, 2, 3, 4, 5, 6, 7]
Entfernt Duplikate (behält die erste gefundene).
[0, 1, 1].union([2, 1], [3, 1]) # => [0, 1, 2, 3]
Behält die Reihenfolge (behält die Position der ersten gefundenen).
[3, 2, 1, 0].union([5, 3], [4, 2]) # => [3, 2, 1, 0, 5, 4]
Ohne Argumente wird eine Kopie von self zurückgegeben.
Zugehörig: siehe Methoden zum Kombinieren.
Source
static VALUE
rb_ary_uniq(VALUE ary)
{
VALUE hash, uniq;
if (RARRAY_LEN(ary) <= 1) {
hash = 0;
uniq = rb_ary_dup(ary);
}
else if (rb_block_given_p()) {
hash = ary_make_hash_by(ary);
uniq = rb_hash_values(hash);
}
else {
hash = ary_make_hash(ary);
uniq = rb_hash_values(hash);
}
return uniq;
}
Gibt ein neues Array zurück, das die Elemente aus self enthält, die keine Duplikate sind, wobei die erste Vorkommnis immer beibehalten wird.
Ohne Block werden Duplikate mithilfe der Methode eql? zum Vergleichen von Elementen identifiziert und weggelassen.
a = [0, 0, 1, 1, 2, 2] a.uniq # => [0, 1, 2]
Mit einem Block wird der Block für jedes Element aufgerufen; „Duplikat“-Elemente werden mithilfe der Methode eql? zum Vergleichen von *Block-Rückgabewerten* identifiziert und weggelassen; d. h., ein Element ist ein Duplikat, wenn sein Block-Rückgabewert derselbe ist wie der eines vorherigen Elements.
a = ['a', 'aa', 'aaa', 'b', 'bb', 'bbb'] a.uniq {|element| element.size } # => ["a", "aa", "aaa"]
Siehe auch: Methoden zum Abrufen.
Source
static VALUE
rb_ary_uniq_bang(VALUE ary)
{
VALUE hash;
long hash_size;
rb_ary_modify_check(ary);
if (RARRAY_LEN(ary) <= 1)
return Qnil;
if (rb_block_given_p())
hash = ary_make_hash_by(ary);
else
hash = ary_make_hash(ary);
hash_size = RHASH_SIZE(hash);
if (RARRAY_LEN(ary) == hash_size) {
return Qnil;
}
rb_ary_modify_check(ary);
ARY_SET_LEN(ary, 0);
if (ARY_SHARED_P(ary)) {
rb_ary_unshare(ary);
FL_SET_EMBED(ary);
}
ary_resize_capa(ary, hash_size);
rb_hash_foreach(hash, push_value, ary);
return ary;
}
Entfernt Duplikate aus self, wobei die erste Vorkommnis immer beibehalten wird; gibt self zurück, wenn Elemente entfernt wurden, andernfalls nil.
Ohne Block werden Elemente mithilfe der Methode eql? zum Vergleichen von Elementen identifiziert und entfernt.
a = [0, 0, 1, 1, 2, 2] a.uniq! # => [0, 1, 2] a.uniq! # => nil
Mit einem Block wird der Block für jedes Element aufgerufen; „Duplikat“-Elemente werden mithilfe der Methode eql? zum Vergleichen von *Block-Rückgabewerten* identifiziert und weggelassen; d. h., ein Element ist ein Duplikat, wenn sein Block-Rückgabewert derselbe ist wie der eines vorherigen Elements.
a = ['a', 'aa', 'aaa', 'b', 'bb', 'bbb'] a.uniq! {|element| element.size } # => ["a", "aa", "aaa"] a.uniq! {|element| element.size } # => nil
Zugehörig: siehe Methoden zum Löschen.
Source
VALUE
rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
{
long len = RARRAY_LEN(ary);
VALUE target_ary;
if (argc == 0) {
rb_ary_modify_check(ary);
return ary;
}
target_ary = ary_ensure_room_for_unshift(ary, argc);
ary_memcpy0(ary, 0, argc, argv, target_ary);
ARY_SET_LEN(ary, len + argc);
return ary;
}
Fügt die angegebenen objects am Anfang von self ein.
a = [:foo, 'bar', 2] a.unshift(:bam, :bat) # => [:bam, :bat, :foo, "bar", 2]
Siehe auch: Array#shift; siehe auch Methoden zum Zuweisen.
Source
static VALUE
rb_ary_values_at(int argc, VALUE *argv, VALUE ary)
{
long i, olen = RARRAY_LEN(ary);
VALUE result = rb_ary_new_capa(argc);
for (i = 0; i < argc; ++i) {
append_values_at_single(result, ary, olen, argv[i]);
}
RB_GC_GUARD(ary);
return result;
}
Gibt Elemente aus self in einem neuen Array zurück; self wird nicht modifiziert.
Die im zurückgegebenen Array enthaltenen Objekte sind die Elemente von self, die durch die angegebenen specifiers ausgewählt wurden, von denen jeder ein numerischer Index oder ein Range sein muss.
Kurz gesagt:
a = ['a', 'b', 'c', 'd'] # Index specifiers. a.values_at(2, 0, 2, 0) # => ["c", "a", "c", "a"] # May repeat. a.values_at(-4, -3, -2, -1) # => ["a", "b", "c", "d"] # Counts backwards if negative. a.values_at(-50, 50) # => [nil, nil] # Outside of self. # Range specifiers. a.values_at(1..3) # => ["b", "c", "d"] # From range.begin to range.end. a.values_at(1...3) # => ["b", "c"] # End excluded. a.values_at(3..1) # => [] # No such elements. a.values_at(-3..3) # => ["b", "c", "d"] # Negative range.begin counts backwards. a.values_at(-50..3) # Raises RangeError. a.values_at(1..-2) # => ["b", "c"] # Negative range.end counts backwards. a.values_at(1..-50) # => [] # No such elements. # Mixture of specifiers. a.values_at(2..3, 3, 0..1, 0) # => ["c", "d", "d", "a", "b", "a"]
Ohne Angabe von specifiers wird ein neues leeres Array zurückgegeben.
a = ['a', 'b', 'c', 'd'] a.values_at # => []
Für jeden numerischen Spezifizierer index wird ein Element aufgenommen.
-
Für jeden nicht-negativen numerischen Spezifizierer
index, der im Bereich liegt (kleiner alsself.size), wird das Element am Offsetindexaufgenommen.a.values_at(0, 2) # => ["a", "c"] a.values_at(0.1, 2.9) # => ["a", "c"]
-
Für jeden negativen numerischen
index, der im Bereich liegt (größer oder gleich- self.size), wird vom Ende vonselfrückwärts gezählt.a.values_at(-1, -4) # => ["d", "a"]
Die gegebenen Indizes können in beliebiger Reihenfolge sein und sich wiederholen.
a.values_at(2, 0, 1, 0, 2) # => ["c", "a", "b", "a", "c"]
Für jeden index, der außerhalb des Bereichs liegt, wird nil aufgenommen.
a.values_at(4, -5) # => [nil, nil]
Für jeden Range-Spezifizierer range werden Elemente gemäß range.begin und range.end aufgenommen.
-
Wenn sowohl
range.beginals auchrange.endnicht-negativ und im Bereich sind (kleiner alsself.size), werden Elemente vom Indexrange.beginbisrange.end - 1(wennrange.exclude_end?) oder bisrange.end(andernfalls) aufgenommen.a.values_at(1..2) # => ["b", "c"] a.values_at(1...2) # => ["b"]
-
Wenn
range.beginnegativ und im Bereich liegt (größer oder gleich- self.size), wird vom Ende vonselfrückwärts gezählt.a.values_at(-2..3) # => ["c", "d"]
-
Wenn
range.beginnegativ und außerhalb des Bereichs liegt, wird eine Ausnahme ausgelöst.a.values_at(-5..3) # Raises RangeError.
-
Wenn
range.endpositiv und außerhalb des Bereichs liegt, wird das zurückgegebene Array mitnil-Elementen erweitert.a.values_at(1..5) # => ["b", "c", "d", nil, nil]
-
Wenn
range.endnegativ und im Bereich liegt, wird vom Ende vonselfrückwärts gezählt.a.values_at(1..-2) # => ["b", "c"]
-
Wenn
range.endnegativ und außerhalb des Bereichs liegt, wird ein leeres Array zurückgegeben.a.values_at(1..-5) # => []
Die gegebenen Bereiche können in beliebiger Reihenfolge sein und sich wiederholen.
a.values_at(2..3, 0..1, 2..3) # => ["c", "d", "a", "b", "c", "d"]
Die gegebenen Spezifizierer können eine beliebige Mischung aus Indizes und Bereichen sein.
a.values_at(3, 1..2, 0, 2..3) # => ["d", "b", "c", "a", "c", "d"]
Zugehörig: siehe Methoden zum Abrufen.
Source
static VALUE
rb_ary_zip(int argc, VALUE *argv, VALUE ary)
{
int i, j;
long len = RARRAY_LEN(ary);
VALUE result = Qnil;
for (i=0; i<argc; i++) {
argv[i] = take_items(argv[i], len);
}
if (rb_block_given_p()) {
int arity = rb_block_arity();
if (arity > 1) {
VALUE work, *tmp;
tmp = ALLOCV_N(VALUE, work, argc+1);
for (i=0; i<RARRAY_LEN(ary); i++) {
tmp[0] = RARRAY_AREF(ary, i);
for (j=0; j<argc; j++) {
tmp[j+1] = rb_ary_elt(argv[j], i);
}
rb_yield_values2(argc+1, tmp);
}
if (work) ALLOCV_END(work);
}
else {
for (i=0; i<RARRAY_LEN(ary); i++) {
VALUE tmp = rb_ary_new2(argc+1);
rb_ary_push(tmp, RARRAY_AREF(ary, i));
for (j=0; j<argc; j++) {
rb_ary_push(tmp, rb_ary_elt(argv[j], i));
}
rb_yield(tmp);
}
}
}
else {
result = rb_ary_new_capa(len);
for (i=0; i<len; i++) {
VALUE tmp = rb_ary_new_capa(argc+1);
rb_ary_push(tmp, RARRAY_AREF(ary, i));
for (j=0; j<argc; j++) {
rb_ary_push(tmp, rb_ary_elt(argv[j], i));
}
rb_ary_push(result, tmp);
}
}
return result;
}
Ohne Block wird self mit der Sammlung von other_arrays kombiniert; gibt ein neues Array von Unterarrays zurück.
[0, 1].zip(['zero', 'one'], [:zero, :one]) # => [[0, "zero", :zero], [1, "one", :one]]
Zurückgegeben
-
Das äußere Array hat die Größe
self.size. -
Jedes Unterarray hat die Größe
other_arrays.size + 1. -
Das *n*-te Unterarray enthält (in Reihenfolge)
-
Das *n*-te Element von
self. -
Das *n*-te Element jedes der anderen Arrays, sofern verfügbar.
-
Beispiel
a = [0, 1] zipped = a.zip(['zero', 'one'], [:zero, :one]) # => [[0, "zero", :zero], [1, "one", :one]] zipped.size # => 2 # Same size as a. zipped.first.size # => 3 # Size of other arrays plus 1.
Wenn die anderen Arrays alle die gleiche Größe wie self haben, sind die zurückgegebenen Unterarrays eine Umordnung, die genau die Elemente aller Arrays (einschließlich self) enthält, ohne Auslassungen oder Ergänzungen.
a = [:a0, :a1, :a2, :a3] b = [:b0, :b1, :b2, :b3] c = [:c0, :c1, :c2, :c3] d = a.zip(b, c) pp d # => [[:a0, :b0, :c0], [:a1, :b1, :c1], [:a2, :b2, :c2], [:a3, :b3, :c3]]
Wenn eines der anderen Arrays kleiner als self ist, werden die entsprechenden Unterarrays mit nil-Elementen aufgefüllt.
a = [:a0, :a1, :a2, :a3] b = [:b0, :b1, :b2] c = [:c0, :c1] d = a.zip(b, c) pp d # => [[:a0, :b0, :c0], [:a1, :b1, :c1], [:a2, :b2, nil], [:a3, nil, nil]]
Wenn eines der anderen Arrays größer als self ist, werden seine nachfolgenden Elemente *ignoriert*.
a = [:a0, :a1, :a2, :a3] b = [:b0, :b1, :b2, :b3, :b4] c = [:c0, :c1, :c2, :c3, :c4, :c5] d = a.zip(b, c) pp d # => [[:a0, :b0, :c0], [:a1, :b1, :c1], [:a2, :b2, :c2], [:a3, :b3, :c3]]
Mit einem Block wird der Block mit jedem der anderen Arrays aufgerufen; gibt nil zurück.
d = [] a = [:a0, :a1, :a2, :a3] b = [:b0, :b1, :b2, :b3] c = [:c0, :c1, :c2, :c3] a.zip(b, c) {|sub_array| d.push(sub_array.reverse) } # => nil pp d # => [[:c0, :b0, :a0], [:c1, :b1, :a1], [:c2, :b2, :a2], [:c3, :b3, :a3]]
Für ein **Objekt** in **other_arrays**, das nicht tatsächlich ein Array ist, wird das "andere Array" als object.to_ary gebildet, falls definiert, oder andernfalls als object.each.to_a.
Zugehörig: siehe Methoden zur Konvertierung.