#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(', ')