Die Programmiersprache Ruby (German Edition)
die Methode
Hash.to_s
in Ruby 1.8 nicht sehr nützlich, und Sie werden lieber
inspect
nutzen wollen, um einen String in Hash-Literalform umzuwandeln. In Ruby 1.9 sind
to_s
und
inspect
gleich:
{:a=>1, :b=>2}.to_s # => "a1b2" in Ruby 1.8; "{:a=>1, :b=>2}" in 1.9
{:a=>1, :b=>2}.inspect # => "{:a=>1, :b=>2}" für beide Versionen
9.5.4 Sets
Ein Set (oder eine Menge ) ist einfach eine Sammlung von Werten ohne Duplikate. Anders als ein Array haben die Elemente eines Sets keine Reihenfolge. Man kann sich einen Hash als Set von Schlüssel/Wert-Paaren vorstellen. Umgekehrt kann ein Set über einen Hash implementiert werden, in dem die Setelemente als Schlüssel genutzt und die Werte ignoriert werden. Ein sortiertes Set ist ein Set, das eine Ordnung für seine Elemente hat (aber keinen freien Zugriff auf sie ermöglicht, wie das bei Arrays der Fall ist). Ein charakteristisches Feature von Setimplementierungen ist, dass sie eine schnelle Prüfung auf Anwesenheit bieten und Einfüge- und Löschoperationen besitzen.
Ruby stellt keinen eingebauen Settyp bereit, aber die Standardbibliothek enthält die Klassen
Set
und
SortedSet
, die Sie verwenden können, wenn Sie zunächst folgende Zeile einbinden:
require 'set'
Die
Set
-API ähnelt in vielerlei Hinsicht den APIs von
Array
und
Hash
. Eine Reihe von
Set
-Methoden und -Operatoren akzeptiert ein beliebiges
Enumerable
-Objekt als Argument.
----
SortedSet
Die Klasse
SortedSet
erbt von
Set
und definiert keine eigenen Methoden – sie stellt nur sicher, dass die Elemente des Sets in sortierter Reihenfolge iteriert (oder ausgegeben oder in Arrays konvertiert) werden können.
SortedSet
ermöglicht Ihnen nicht, einen eigenen Block zum Vergleichen von Setelementen anzugeben und macht es erforderlich, dass alle Setelemente gegenseitig über ihren Standardoperator
<=>
verglichen werden können. Da sich die
SortedSet
-API nicht von der normalen
Set
-API unterscheidet, wird sie hier nicht weiter behandelt.
----
9.5.4.1 Sets erstellen
Da
Set
keine Core-Klasse von Ruby ist, gibt es keine literale Syntax für das Erstellen von Sets. Die Bibliothek
set
fügt dem Modul
Enumerable
eine Methode
to_set
hinzu, womit ein Set aus jedem enumerierbaren Objekt erzeugt werden kann:
(1..5).to_set # => #
[1,2,3].to_set # => #
Alternativ kann ein beliebiges enumerierbares Objekt an
Set.new
übergeben werden. Wenn ein Block bereitgestellt wird, wird dieser (zusammen mit dem Iterator
map
) verwendet, um die enumerierten Werte vor dem Hinzufügen zum Set zu bearbeiten:
Set.new(1..5) # => #
Set.new([1,2,3]) # => #
Set.new([1,2,3]) {|x| x+1} # => #
Wenn Sie es vorziehen, die Elemente Ihres Sets zu enumerieren, ohne sie vorher in einem Array oder einem anderen enumerierbaren Objekt unterbringen zu müssen, verwenden Sie den Operator
[]
der Klasse
Set
:
Set["cow", "pig", "hen"] # => #
9.5.4.2 Testen, vergleichen und kombinieren von Sets
Die am häufigsten verwendete Operation auf Sets ist normalerweise das Prüfen auf Anwesenheit:
s = Set.new(1..3) # => #
s.include? 1 # => true
s.member? 0 # => false: member? ist ein Synonym
Es ist auch möglich, Sets auf Anwesenheit in anderen Sets zu prüfen. Ein Set S ist ein Subset von T, wenn alle Elemente von S auch Elemente von T sind. Wir können auch sagen, dass T ein Superset von S ist. Wenn zwei Sets gleich sind, sind sie sowohl Subsets als auch Supersets voneinander. S ist ein echtes Subset von T, wenn es ein Subset von T, aber nicht gleich mit ihm ist. In diesem Fall ist T ein echtes Superset von S:
s = Set[2, 3, 5]
t = Set[2, 3, 5, 7]
s.subset? t # => true
t.subset? s # => false
s.proper_subset? t # => true
t.superset? s # => true
t.proper_superset? s # => true
s.subset? s # => true
s.proper_subset? s # => false
Set
definiert die gleichen Größenmethoden wie
Array
und
Hash
:
s = Set[2, 3, 5]
s.length # => 3
s.size # => 3: ein Synonym für length
s.empty? # => false
Set.new.empty? # => true
Neue Sets können durch die Kombination zweier bestehender Sets erzeugt werden. Es gibt viele verschiedene Möglichkeiten dafür, und
Set
definiert die Operatoren
&
,
|
,
-
und
^
(plus »normale« Methoden als Aliase):
# Zwei einfache Sets
primes = Set[2, 3, 5, 7]
odds = Set[1, 3, 5, 7, 9]
# Die Schnittmenge ist die Menge der Werte, die in beiden Sets vorhanden sind.
primes & odds # => #
primes.intersection(odds) # dies
Weitere Kostenlose Bücher