2010-08-13 4 views
0

Faire une boucle très simple pour afficher diverses données,boucles dans ruby ​​

pour _test dans @test ...

Je veux pouvoir,

1) obtenir la première valeur _test .name.first() ???

2) obtenir la valeur précédente (ce qui signifie, la dernière itération, donc je i réitérait la première fois, je veux le saisir à nouveau, lorsque son dans la seconde boucle

Merci

- - mise à jour

ce que je veux dire est-ce

  1. Doug, 2. Paul 3.Steve

Donc, quand j'ai Paul comme nom actuel, je veux être en mesure d'obtenir la dernière itération (Doug) et même avec Steve (obtenir Paul) .... Donc, comme un tableau, obtenir le dernier, premier mais dans ce Si la valeur précédente

Répondre

2

est ici un moyen hacky mais simple de le faire:

prev = nil 
first = nil 
(1..10).each do |i| 
    if !prev.nil? then 
     puts "#{first} .. #{prev} .. #{i}" 
     prev = i 
    elsif !first.nil? then 
     puts "#{first} .. #{i}" 
     prev = i 
    else 
     puts i 
     first = i 
    end 
end 

sortie:

1 
1 .. 2 
1 .. 2 .. 3 
1 .. 3 .. 4 
1 .. 4 .. 5 
1 .. 5 .. 6 
1 .. 6 .. 7 
1 .. 7 .. 8 
1 .. 8 .. 9 
1 .. 9 .. 10 
3
  1. Je ne sais pas ce que vous entendez ici. @test.first vous donnera premier sapin article dans la collection. Sinon, que voulez-vous dire par la "première valeur" de l'objet _test?

  2. each_cons peut vous aider: il itère sur un tableau en vous donnant des sous-matrices consécutives. Un exemple: [:a, :b, :c, :d].each_cons(2).to_a résultats dans [[:a, :b], [:b, :c], [:c, :d]]

1

Vous feriez mieux de clarifier votre question, il est assez déroutant de cette façon. Je ne comprends pas 1), donc je vais essayer d'adresser 2), au moins de la façon dont je l'ai compris.

Il y a une méthode Enumerable#each_cons, je pense qu'il est là de Ruby 1.8.7 partir, qui prend plus d'un élément à chaque itération:

(1..10).each_cons(2) do |i,j| 
    puts "#{i}, #{j}" 
end 
1, 2 
2, 3 
3, 4 
4, 5 
5, 6 
6, 7 
7, 8 
8, 9 
9, 10 
#=> nil 

Donc, effectivement, vous obtiendrez le précédent (ou suivant , selon la façon dont vous le voyez) valeur à chaque itération.

Afin de vérifier si vous êtes dans la première itération, vous pouvez utiliser #with_index:

('a'..'f').each.with_index do |val, index| 
    puts "first value is #{val}" if index == 0 
end 
#=>first value is a 

Et vous pouvez combiner les deux de ce qui précède dans la même boucle.

0

Vous pouvez frapper quelque chose comme ça avec inject:

# passing nil to inject here to set the first value of last 
# when there is no initial value 
[1,2,3,4,5,6].inject(nil) do |last, current| 
    # this is whatever operation you want to perform on the values 
    puts "#{last.inspect}, #{current}" 
    # end with 'current' in order to pass it as 'last' in the next iteration 
    current 
end 

Cela devrait quelque chose comme de sortie:

nil, 1 
1, 2 
2, 3 
3, 4 
4, 5 
5, 6