2016-10-03 2 views
2

Ich habe einige Zweifel über die Unterschiede zwischen 'für' und 'jedem' Iteratoren auf Ruby on Rails.Unterschied zwischen 'for' und 'each' Iteratoren auf Ruby on Rails

Ich habe diesen Fall, wie ist die beste Praxis dafür?

Def (Methode), die in der Datei application_helper.rb:

def milestone_icons 
    icons = ["", "icon-world", "icon-star-twohdd-o", "icon-users", "icon-notification", "icon-clock", "icon-eye", "icon-like-filled", "icon-credit-card", "icon-bell" ] 
end 

vorliegende Wählen in der haml Datei:

%select.js-select-icons{style: 'width: 50px', name: 'milestone[icon]'} 
    - for icon in milestone_icons do 
     %option{value: icon, type: "icon", selected: (@generic.icon == icon)} 
     = "<i class='#{icon}'></i>".html_safe 
+0

die Art, wie Sie es hier verwenden ('für Symbol in milestone_icons') ist das gleiche wie das Schreiben von' milestrone_icons.each do | icon | '. –

+0

Ok, danke, aber für Ruby, haben Sie einen Unterschied? Best Practice für diese Art von Bedingung? –

+2

Enumeratoren werden häufig Loops vorgezogen (einschließlich 'For'-Loops), da bei ersterem der Wert des Iterators auf den Block beschränkt ist, wo es für alle sichtbar ist, wenn eine Schleife verwendet wird. Zum Beispiel: 'für n in [1,2,3] tun; setzt n; Ende; n # => 3 '(nach dem Ausdrucken von "1", "2", "3"). Im Gegensatz dazu ist "[1,2,3] .each {| n | setzt n}; n # => NameError: undefinierte lokale Variable oder Methode 'n' für main: Object'. Viele (die meisten?) Rubies * benutzen niemals 'for' Loops. Ich habe * nie * einen benutzt, nicht einmal! :-) –

Antwort

3

Überraschenderweise das for Konstrukt in Ruby wird kaum verwendet. Leute neigen dazu, den each Stil-Iterator oder einen seiner Freunde wie each_with_index oder each_with_object vorzuziehen, da diese wesentlich vielseitiger sind und oft bessere Ergebnisse erzielen.

Ich empfehle dringend die Verwendung der each Methode, es sei denn, Sie haben einen sehr zwingenden Grund.

Die Unterschiede sind etwas akademisch, aber der große Vorteil der Verwendung each ist, dass Sie tatsächlich mit einem Iterator interagieren und Sie haben eine Menge Möglichkeiten, das zu verwenden. Sie können einen Iterator von einer Methode zur anderen durchlaufen und Sie können sie zusammenketten, um die richtige Struktur zu erstellen, bevor Sie mit der Arbeit beginnen.

Das echte Fleisch hier ist innerhalb Enumerable, wo each ist die grundlegendste Version dieser Art von Iterator. Es gibt viele, die oft viel besser zu jedem Problem passen, das Sie zu lösen versuchen.

Also, ja, for und each sind im Grunde die gleichen, aber each ist besser, weil es Freunde hat.

+1

Danke für die Antwort! Jetzt verstehe ich, es ist nicht wegen der Leistung oder anderer Dinge empfohlen, aber ist, weil die Familie des Objekts, das ich mit ihnen verwenden kann ... In diesem Fall werde ich das "jedes" jetzt verwenden, und wenn ich andere Zweifel habe frage ich hier im stackoverflow. –

+0

Ich glaube, dass die 'for'-Schleife in der Tat mit dem' Each'-Iterator aufgebaut ist. –

+0

@ sagarpandya82 Ich bin mir da nicht so sicher. Es gibt feine Unterschiede in ihrer Funktionsweise, auch wenn sie weitgehend identisch sind. – tadman