Подтвердить что ты не робот

Как определить, является ли запись первой/последней на итерации?

Это то, что заставило меня задуматься несколько раз. В этом примере у меня есть массив, и этот массив имеет 10 значений, которые должны быть разделены запятыми, но после последнего не должно быть commata, поэтому я использовал счетчик:

data = ["john", "james", "henry", "david", "daniel", "jennifer", "ruth", "penny", "robin", "julia"]
counter = 0 
count = data.size
sentence = String.new
data.each do |name|
     if counter == (count-1)
          sentence += name
     else
          sentence += "#{name}, "
     end
     counter += 1
end

Но это так грязно, нет ли способа узнать, является ли текущий объект (в данном случае "имя" ) frist или последним на итерации?

4b9b3361

Ответ 1

в этом конкретном случае, data.join(', ') сделал бы, в общем, data.each {|d| #do stuff unless d.equal? data.last}

Ответ 2

Вам нужно data.join(', '). Во всяком случае, отвечая на ваш вопрос:

Нет ли способа узнать, является ли текущий объект (в данном случае "имя" ) первым или последним в итерации?

xs = [1, 2, 3, 4]
xs.each.with_index do |x, index|
  if index == 0
    puts("First element: #{x}")
  elsif index == xs.size - 1
    puts("Last element: #{x}")
  else
    puts("Element somewhere in the middle: #{x}")
  end
end

Ответ 3

Вы можете использовать name==data.last, если ваш массив имеет уникальные элементы

В противном случае используйте напрямую

data.join(', ')