2010-07-27 7 views
13

Ich lerne Ruby und RoR im Moment, und ich kam in diesem:Was ist der Sinn von "für x in y" in Ruby?

<% for post in @posts %> 

im Rails guide. Ich habe verstanden, dass der idiomatische Weg, dies in Ruby zu tun mit ist:

<% @posts.each do |post| %> 

Wenn es ein Unterschied dann ist das, was ist es? Und wenn es keinen Unterschied gibt, wäre es dann nicht besser für die Leute von Rails, richtige Ruby-Idiome zu pushen (anstatt das, was für mich pythonischer aussieht)?

Edit: Ich habe gerade zwei widersprüchliche Erklärungen dafür: Tutorials Point sagt sie das gleiche mit Ausnahme von „einer for-Schleife keinen neuen Rahmen für lokale Variablen erstellen“ sind, während CS.Auckland.ac.NZfor sagt, ist nur syntaktischer Zucker für das Äquivalent .each.

Edit2: Die for ... in in Frage war für die in app/views/posts von script/generate scaffold erzeugt index.html.erb. Ich habe eine schnelle Überprüfung durchgeführt und das generiert nun die .each Syntax. Ich denke, dieser Teil des Leitfadens wurde in einem früheren Stadium der Schienenentwicklung geschrieben, als das Gerüst for ... in erzeugte.

Edit3: Ich kann jetzt bestätigen, dass for x in y in Rails 2.2.2 verwendet wurde, aber von 2.3.8 ist es y.each do |x| verwenden. Nur damit du es weißt.

Antwort

21

Die tutorialpoint-Seite ist korrekt, for entspricht each mit Ausnahme der Bereichsunterschiede. Hier ist eine Demonstration:

arr = [1,2,3] 
arr.each do |x| 
    last = x 
end 
last # NameError 

vs

arr = [1,2,3] 
for x in arr 
    last = x 
end 
last #=> 3 

Wenn Sie wollen, dass es each mit make zu arbeiten, müssen Sie last = nil vor der Schleife zu tun. Dies ist, wie der Link gezeigt hat, weil Blöcke einen neuen Bereich starten, während for dies nicht tut.

Beachten Sie jedoch, dass dies selten einen praktischen Unterschied macht und nur wenige Menschen davon bewusst sind. Wenn Leute for in Ruby verwenden, ist es meistens, weil sie es gewohnt sind, aus anderen Sprachen zu kommen - nicht wegen irgendwelcher Unterschiede zwischen for und each.

+0

Danke! Genau das, was ich gesucht habe. Das bringt mich zurück zu meinem ursprünglichen Punkt, weshalb würde das Rails-Team (oder zumindest derjenige, der den Leitfaden für Erste Schritte geschrieben hat) mit der "for ... in" -Syntax umgehen? – Skilldrick

+2

Es gibt viele Leute, die Schienen lernen, ohne zuerst Rubin gelernt zu haben. Ich nehme an, dass der Leitfaden in einem Stil geschrieben ist, der Menschen aus anderen Sprachen bekannt vorkommen soll. – sepp2k

+0

Ein verwandter Unterschied zwischen den beiden, der nicht offensichtlich ist, nur aus diesem Beispiel: 'a = []; für x in [1,2,3,4]; ein << proc {x} Ende; map (&: call) 'ergibt' [4,4,4,4] ', während das Äquivalent zu' each ''[1,2,3,4]' ergibt, weil 'each' eine neue' x'-Bindung einführt mit jeder Iteration. – Chuck

0

Die Sache ist, dass das erste Beispiel (for post in @posts) mehr "prozedurale" aussieht, während das zweite (@posts.each do |post|) mehr "funktional" aussieht. Leider ist die prozedurale Art, Code zu lesen, immer noch populärer, klarer und weniger "geeky". Deshalb würden viele es vielleicht der "nativen" Art der Iteration durch Container vorziehen.

Wenn es pythonisch aussieht (ich bin mir nicht sicher, ob es wahr ist), kann es als noch besser angesehen werden, da es die Zugänglichkeit von Rails durch Entwickler verbessert, die von anderen Plattformen kommen.

Persönlich möchte ich Rubin und "funktionale" Möglichkeiten, um geschoben werden. Aber die oben genannten Gründe zeigen, dass dies in beiden Richtungen möglich ist.

+0

Ich sage, es sieht pythonisch, weil 'for ... in' der Standard Weg ist, in Python zu iterieren. – Skilldrick

+1

@skill, und es ist eine Standardmethode zum Iterieren in anderen Sprachen (z. B. obsolete Perl-Syntax). Es ist auch das * natürliche * (in dem Sinn, wie Menschen darüber reden), durch jede Sammlung zu iterieren. –

+0

ja, ich verstehe was du meinst. Ich sagte nicht unbedingt, dass sie Python kopierten, nur dass es mehr wie Python aussieht. – Skilldrick

0

Eines Tages entwickelte ich die Funktion zum Erstellen von PDF-Berichten für die Website, an der ich arbeitete.

Das Plugin, das ich verwendete, hatte viele Einschränkungen. Diese Einschränkungen zwangen mich, die Lösung zu finden, die sehr zwingend und prozedural war. Ich benutzte Konstruktionen wie while oder for, nur um diese Art der Programmierung zu betonen.

In der Tat war dies die einzige Situation, wenn ich diese Schlüsselwörter in Ruby verwendete.

0

Sie können for x in y verwenden, wenn Sie versuchen, Ruby Profiling zu tun und Ihre Version von Ruby-Prof method elimination nicht haben.

0

Eine weitere Sache über for x in y ist, dass Sie for i in 1..5 tun können, die sich wie ein Standard für die Schleife arbeiten, bei i = 1 Start und gehen durch i = 5.

Das handliche daran ist, dass Sie einen Bereich wie 3..8 oder x..y verwenden können, Sie sind nicht von Null beginnend, die Sie mit der Methode n.times wäre.

+0

Wäre nicht 1.upto (5) .each {| x | #etwas} kümmert sich darum? – graydot

+0

@jeba ya es wäre. Ich bin relativ neu zu Rubin, also hatte ich das vorher nicht gesehen. Also vielen Dank! Ich lerne jeden Tag etwas Neues! –

+2

Sie können auch '(1..5) .each' – Skilldrick