Dynamisch einen mehrdimensionalen Hash in Ruby erstellen

7

Ich bin ein PHP-Entwickler, der versucht, einige Kenntnisse in Ruby zu erwerben. Eines der Projekte, mit denen ich mich jetzt auseinandersetze, ist ein Quellcode-Auditing-Tool, das Webapp-Dateien nach potenziell gefährlichen Funktionen in verschiedenen Web-Programmiersprachen scannt. Wenn Übereinstimmungen gefunden werden, speichert das Skript die relevanten Informationen in einer Klasse poi (Point-of-Interest) zur späteren Anzeige.

Eine Beispielinstanz dieser Klasse würde ungefähr so ​​aussehen (in YAML modelliert):

%Vor%

Auf dem Display möchte ich diese interessanten Punkte wie folgt organisieren:

%Vor%

Ich versuche also, vor der Präsentation ein flaches Array von poi -Objekten in einen Hash zu strukturieren, der die obige Struktur widerspiegelt. Dies ermöglicht es mir, einfach über die Elemente im Hash zu iterieren, um die gewünschte Organisation auf dem Bildschirm zu erzeugen. (Oder zumindest, das ist der Plan.)

Und nun zu meiner Frage: Wie mache ich das in Ruby?

In PHP könnte ich so etwas ganz einfach machen:

%Vor%

Ich habe versucht, diesen Gedanken von PHP nach Ruby zu übersetzen, aber ohne Erfolg:

%Vor% Ich habe ein paar Stunden damit verbracht, und an dieser Stelle hämmere ich meinen Kopf gegen die Wand, also bin ich vermutlich ziemlich verrückt. Was ist der richtige Weg, um dies in Ruby zu behandeln?

Aktualisierung:

Als Referenz ist dies die genaue Methode, die ich definiert habe:

%Vor%

Dies ist der Fehler, den ich beim Ausführen des Codes erhalte:

%Vor%

Zeile 62 (wie Sie wahrscheinlich schließen können) ist diese Zeile insbesondere:

%Vor%

Als zusätzliche Referenz sehen Sie, was (ein Ausschnitt von) @points_of_interest bei der Konvertierung in YAML aussieht:

%Vor%     
Chris Allen Lane 20.04.2012, 20:26
quelle

3 Antworten

27

@ Johns Enumerable#group_by suggestion ist ein guter Weg, um Ihre Bedürfnisse zu lösen. Ein anderer wäre, einen automatisch belebenden Hash zu erstellen (so wie es in PHP aussieht):

%Vor%

Beachten Sie, dass diese Art der automatischen Aktivierung "gefährlich" sein kann, wenn Sie auf Schlüssel zugreifen, die nicht existieren, da sie diese für Sie erstellen:

%Vor%

Sie können das vivifying default_proc noch verwenden, ohne diese Gefahr zu riskieren, wenn Sie key? verwenden, um zuerst nach dem Schlüssel zu suchen:

%Vor%

FWIW, der Fehler, den Sie erhalten, lautet: "Hey, Sie haben [] nach etwas gesetzt, das auf nil ausgewertet wurde, und nil hat keine [] -Methode." Genauer gesagt, Ihr Code ...

%Vor%

wurde auf nil ausgewertet (weil der Hash für diesen Schlüssel noch keinen Wert hatte) und Sie haben dann nach

gefragt %Vor%     
Phrogz 20.04.2012, 20:48
quelle
7

Vielleicht interessiert dich group_by .

Beispielverwendung:

%Vor%     
John Ledbetter 20.04.2012 20:43
quelle
2

Das offensichtliche Problem im obigen Beispiel ist, dass geschachtelte Hashes und Arrays, die Sie verwenden möchten, nicht existieren. Versuchen Sie Folgendes:

%Vor%     
Lukas Stejskal 20.04.2012 20:42
quelle

Tags und Links