402 Stimmen

Was ist der "richtige" Weg, um durch ein Array in Ruby zu iterieren?

PHP ist in dieser Hinsicht trotz all seiner Schwächen ziemlich gut. Es gibt keinen Unterschied zwischen einem Array und einem Hash (vielleicht bin ich naiv, aber das scheint mir offensichtlich richtig zu sein), und um durch beide zu iterieren, machen Sie einfach

foreach (array/hash as $key => $value)

In Ruby gibt es eine Reihe von Möglichkeiten, diese Art von Dingen zu tun:

array.length.times do |i|
end

array.each

array.each_index

for i in array

Hashes machen mehr Sinn, da ich einfach immer

hash.each do |key, value|

Warum kann ich dies nicht für Arrays tun? Wenn ich mir nur eine Methode merken möchte, kann ich wohl Folgendes verwenden each_index (da es sowohl den Index als auch den Wert verfügbar macht), aber es ist ärgerlich, wenn man die array[index] statt nur value .


Ach ja, ich vergaß array.each_with_index . Dieser hier ist jedoch scheiße, denn er geht |value, key| y hash.each geht |key, value| ! Ist das nicht wahnsinnig?

2voto

Der richtige Weg ist der, mit dem Sie sich am wohlsten fühlen und der das bewirkt, was Sie wollen. Beim Programmieren gibt es selten nur einen "richtigen" Weg, sondern oft mehrere Möglichkeiten, die man wählen kann.

Wenn Sie mit einer bestimmten Art und Weise, Dinge zu tun, zufrieden sind, tun Sie genau das, es sei denn, es funktioniert nicht - dann ist es Zeit, einen besseren Weg zu finden.

2voto

tanius Punkte 9822

Die Verwendung derselben Methode für die Iteration durch Arrays und Hashes ist sinnvoll, um beispielsweise verschachtelte Hash- und Array-Strukturen zu verarbeiten, die häufig von Parsern oder beim Lesen von JSON-Dateien usw. entstehen.

Ein cleverer Weg, der noch nicht erwähnt wurde, ist die Art und Weise, wie dies in der Rubin-Facetten Bibliothek mit Erweiterungen der Standardbibliothek. Von aquí :

class Array

  # Iterate over index and value. The intention of this
  # method is to provide polymorphism with Hash.
  #
  def each_pair #:yield:
    each_with_index {|e, i| yield(i,e) }
  end

end

Es gibt bereits Hash#each_pair , ein Alias von Hash#each . Nach diesem Patch haben wir also auch Array#each_pair und kann es austauschbar verwenden, um sowohl durch Hashes als auch durch Arrays zu iterieren. Dies behebt den von OP beobachteten Irrsinn, dass Array#each_with_index hat die Blockargumente im Vergleich zu Hash#each . Beispiel für die Verwendung:

my_array = ['Hello', 'World', '!']
my_array.each_pair { |key, value| pp "#{key}, #{value}" }

# result: 
"0, Hello"
"1, World"
"2, !"

my_hash = { '0' => 'Hello', '1' => 'World', '2' => '!' }
my_hash.each_pair { |key, value| pp "#{key}, #{value}" }

# result: 
"0, Hello"
"1, World"
"2, !"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X