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

#ruby

#ruby

Вопрос:

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

 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
 

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

Комментарии:

1. data.join(', ') если я вас правильно понял

Ответ №1:

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

Комментарии:

1. == потерпит неудачу, если в списке есть еще одна «Джулия». d.equal?(data.last) тесты на равенство объектов.

2. конечно — всегда забывай не уникальный случай — спасибо — я исправил ответ, чтобы никто не копировал, не читая комментарии

Ответ №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("Somewhere in the middle: #{x}")
  end
end
 

Ответ №3:

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

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

 data.join(', ')