петли в рубине - PullRequest
       8

петли в рубине

0 голосов
/ 13 августа 2010

Выполнение очень простого цикла для отображения различных данных,

для _test in @test ...

Я хочу, чтобы

1) получитьfirst value _test.name.first () ???

2) получить предыдущее значение (имеется в виду, последняя итерация, поэтому я повторил первый раз, я хочу получить его снова, когда он ввторой цикл

Спасибо

--- обновление

Что я имею в виду, это

  1. Даг, 2. Пол 3. Стив

Так что, когда у меня есть Пол в качестве текущего имени, я хочу иметь возможность получить последнюю итерацию (Дуг) и то же самое со Стивом (получить Пола) .... Так что, как массив, получить последнеесначала, но в этом случае предыдущее значение

Ответы [ 4 ]

3 голосов
/ 13 августа 2010
  1. Я не уверен, что вы имеете в виду здесь.@test.first даст вам первый предмет в коллекции.В противном случае, что вы подразумеваете под «первым значением» объекта _test?

  2. each_cons может помочь вам: он перебирает массив, давая вам последовательные подмассивы,Пример: [:a, :b, :c, :d].each_cons(2).to_a приводит к [[:a, :b], [:b, :c], [:c, :d]]

2 голосов
/ 13 августа 2010

Вот хакерский, но простой способ сделать это:

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

Выход:

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
1 голос
/ 13 августа 2010

Тебе лучше уточнить свой вопрос, это довольно запутанно.

Я не понимаю 1), поэтому я попытаюсь обратиться к 2), по крайней мере, так, как я понял.

Есть метод Enumerable#each_cons, я думаю, что он существует начиная с Ruby 1.8.7, который использует более одного элемента в каждой итерации:

(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

Таким образом, по сути, вы получите предыдущее (или следующее, в зависимости от того, как вы его видите) значение на каждой итерации.

Чтобы проверить, находитесь ли вы в первой итерации, вы можете использовать #with_index:

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

И вы можете объединить оба вышеперечисленных в одном цикле.

0 голосов
/ 15 августа 2010

Вы можете создать что-то подобное с помощью команды 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

Это должно вывести что-то вроде:

nil, 1
1, 2
2, 3
3, 4
4, 5
5, 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...