it-swarm.com.de

Fetch vs. [] bei der Arbeit mit Hashes?

Von Ruby Koans about_hashes.rb:

Warum möchten Sie vielleicht #fetch Anstatt von #[] beim Zugriff auf Hash-Schlüssel?

65
allanberry

Standardmäßig wird bei Verwendung von #[] Der Hash-Wert abgerufen, falls er existiert, und null zurückgegeben, falls er nicht existiert *.

Mit #fetch Haben Sie einige Optionen (siehe Dokumentation zu # fetch ):

  • fetch(key_name): Ermittelt den Wert, wenn der Schlüssel existiert, und erhöht ein KeyError, wenn dies nicht der Fall ist
  • fetch(key_name, default_value): Ermittelt den Wert, wenn der Schlüssel existiert, andernfalls default_value
  • fetch(key_name) { |key| "default" }: Ermittelt den Wert, falls der Schlüssel existiert, andernfalls führt man den angegebenen Block aus und gibt den Wert zurück.

Jedes sollte verwendet werden, wie es die Situation erfordert, aber #fetch Ist sehr funktionsreich und kann je nach Verwendung viele Fälle behandeln. Aus diesem Grund bevorzuge ich den Zugriff auf Schlüssel mit #[].

* Wie Marc-André Lafortune sagte, wird beim Zugriff auf einen Schlüssel mit #[]#default_proc Aufgerufen, falls vorhanden, oder es wird #default Zurückgegeben. Der Standardwert ist nil. Siehe der Dokumenteintrag für ::new für weitere Informationen.

136
Jon Cairns

Mit [], der Ersteller des Hashs, kontrolliert mit fetch, was passiert, wenn ein Schlüssel nicht existiert.

24
Jörg W Mittag

fetch löst standardmäßig einen Fehler aus, wenn der Schlüssel nicht gefunden wird. Sie können stattdessen einen Standardwert angeben.

h = {}

h.fetch(:foo) # no default value, raises error
# => # ~> -:3:in `fetch': key not found: :foo (KeyError)

h.fetch(:bar, 10) # default value, returns default value
# => 10
6