2011-10-22 55 views
12

它让我多次思考。在这个例子中我有一个数组,该数组具有应当由commatas被分隔,但最后一个之后存在不应该是一个commata所以我用一个计数器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 

但是,这是如此脏心不是有任何方法来查明当前对象(在本例中是“name”)是迭代中的第一个还是最后一个?

在这种特殊情况下
+1

'data.join( ''),'如果我正确理解 – user973254

回答

25

data.join(', ')会做,更普遍data.each {|d| #do stuff unless d.equal? data.last}

+1

你''==会如果有另一种 '朱莉娅' 列表中的失败。 'd.equal?(data.last)'测试对象是否相等。 – steenslag

+1

当然 - 永远忘记不是唯一的情况 - 谢谢 - 我已经改正了答案,所以没有人阅读评论的副本 – chrispanda

5

您可以使用name==data.last如果你的阵列是独特的元素

的,否则直接使用

data.join(', ') 
6

你需要data.join(', ')。总之,回答你的问题:

是否有任何方法来确定当前对象(在本例中是“name”)是迭代中的第一个还是最后一个?

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 
相关问题