2011-10-22 19 views
12

Es una cosa que me hizo pensar varias veces. En este ejemplo tengo una matriz y esta matriz tiene 10 valores que deben ser separados por commatas pero después de la última allí no debería ser un commata por lo que utiliza un contador:¿Cómo determinar si un registro es el primero/último en una iteración?

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 

pero esto es isnt tan sucio Hay alguna método para averiguar si el objeto actual (en este caso, "nombre") es el primero o el último en la iteración?

+1

'data.join ('')' si he entendido bien – user973254

Respuesta

25

en este caso específico, data.join(', ') haría, más en general data.each {|d| #do stuff unless d.equal? data.last}

+1

'' == fallaría si hay otro 'Julia' en la lista. 'd.equal? ​​(data.last)' prueba de igualdad de objetos. – steenslag

+1

por supuesto - siempre olvide el caso no único - gracias - he corregido la respuesta para que nadie copie sin leer los comentarios – chrispanda

5

Puede utilizar name==data.last si la matriz es de elementos únicos

De lo contrario usar directamente

data.join(', ') 
6

Es necesario data.join(', '). De todos modos, respondiendo a su pregunta:

¿No hay algún método para averiguar si el objeto actual (en este caso "nombre") es el primero o el último de la iteración?

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 
Cuestiones relacionadas