2008-09-30 14 views
23

En Ruby:¿Qué es "para" en Ruby

for i in A do 
    # some code 
end 

es lo mismo que:

A.each do |i| 
    # some code 
end 

for no es un núcleo método:

  • ¿Qué es exactamente "for "en ruby ​​
  • ¿Hay alguna manera de usar otras palabras clave para hacer cosas similares? ?

Algo así como:

total = sum i in I {x[i]} 

mapeo a:

total = I.sum {|i] x[i]} 

Respuesta

45

Es casi sintaxis azúcar. Una diferencia es que, aunque for usaría el alcance del código que lo rodea, each crea un ámbito separado dentro de su bloque. Compare los siguientes:

for i in (1..3) 
    x = i 
end 
p x # => 3 

frente

(1..3).each do |i| 
    x = i 
end 
p x # => undefined local variable or method `x' for main:Object 
+0

Guau, tan sutil, pero será útil cuando me encuentre con algo como esto. ¡Gracias! – sivabudh

+0

En realidad, su segundo ejemplo arroja 'NameError: variable local indefinida o método 'i' para main: Object'. Es porque te falta un 'hacer'. –

+0

@JakubHampl Lo arreglé. ¡Gracias! –

14

for es simplemente azúcar sintaxis del método each. Esto se puede ver mediante la ejecución de este código:

for i in 1 do 
end 

Esto da como resultado el error:

NoMethodError: undefined method `each' for 1:Fixnum 
+3

-1 porque hay una diferencia entre los dos, y no siempre son equivalentes. – user2398029

9

es sólo para el azúcar sintáctica.

De the pickaxe:

For ... In

Earlier we said that the only built-in Ruby looping primitives were while and until. What's this ``for'' thing, then? Well, for is almost a lump of syntactic sugar. When you write

for aSong in songList 
    aSong.play 
end 

Ruby translates it into something like:

songList.each do |aSong| 
    aSong.play 
end 

The only difference between the for loop and the each form is the scope of local variables that are defined in the body. This is discussed on page 87.

You can use for to iterate over any object that responds to the method each, such as an Array or a Range.

for i in ['fee', 'fi', 'fo', 'fum'] 
    print i, " " 
end 
for i in 1..3 
    print i, " " 
end 
for i in File.open("ordinal").find_all { |l| l =~ /d$/} 
    print i.chomp, " " 
end 

produces:

fee fi fo fum 1 2 3 second third 

As long as your class defines a sensible each method, you can use a for loop to traverse it.

class Periods 
    def each 
    yield "Classical" 
    yield "Jazz" 
    yield "Rock" 
    end 
end 


periods = Periods.new 
for genre in periods 
    print genre, " " 
end 

produces:

Classical Jazz Rock 

Ruby no tiene otras palabras clave de comprensión (como el ejemplo que acaba de realizar la suma). for no es una palabra clave terriblemente popular, y la sintaxis del método (arr.each {}) es generalmente preferida.