Ответ 1
в этом конкретном случае, data.join(', ')
сделал бы, в общем, data.each {|d| #do stuff
unless d.equal? data.last}
Это то, что заставило меня задуматься несколько раз. В этом примере у меня есть массив, и этот массив имеет 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 или последним на итерации?
в этом конкретном случае, data.join(', ')
сделал бы, в общем, data.each {|d| #do stuff
unless d.equal? data.last}
Вам нужно 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
Вы можете использовать name==data.last
, если ваш массив имеет уникальные элементы
В противном случае используйте напрямую
data.join(', ')