2009-04-29 19 views
18

que tiene una matriz de este modo:Ruby: ¿Cómo unir elementos de una matriz junto con un prefijo?

["marblecake", "also", "the", 1337] 

me gustaría volver una cadena que contiene cada elemento de la matriz prefijado por alguna cadena especificada, a continuación, unidas entre sí por otra cadena especificada. Por ejemplo,

["marblecake", "also", "the", 1337].join_with_prefix("%", "__") 

debería resultar en

# => %marblecake__%also__%the__%1337 

¿Cómo podría yo hacer esto?

Respuesta

38

Si la matriz está en a entonces esto de una sola línea lo hará

a.map { |k| "%#{k}" }.join("_") 

Desde aquí se puede poner esto en función de su propio - incluso añadirlo a la clase Array modo que se le puede llamar en una matriz, como en tu ejemplo.

Tenga en cuenta que el '!' la versión del mapa (map!) modificará la matriz en su lugar, tal vez no su intención.

+12

¿Por qué utiliza la versión destructiva, en lugar de "mapa"? Dependiendo de cómo se vea el código del OP, podría tener algunos efectos secundarios no deseados. –

+0

Eso hizo el truco. Muchas gracias, Cody. –

+0

Jason: Aquí solo se almacenan primitivas/cadenas. ¿Hay alguna alternativa que recomiendas? –

2

De acuerdo con la sugerencia anterior:

class Array 
    def join_with_prefix(prefix,separator) 
    self.collect {|e| prefix.to_s + e }.join(separator) 
    end 
end 

p ['ab','cd','ef'].join_with_prefix('%','__') 
=> "%ab__%cd__%ef"
+2

Esto supone que estás tratando de unirte a una serie de cadenas; si tuvieras una matriz de enteros por ejemplo, la parte "+ e" fallaría, ya que el "+" no está implementado para string + integer Un mejor enfoque sería hacer la concatenación de cadenas en una cadena de comillas dobles con una interpolación de cadenas "# {e}" que implícitamente to_s su elemento, por lo tanto: self.collect {| e | "# {prefijo} # {e}"}. join (separador) Es más flexible. –

+0

O simplemente podría hacer 'prefix.to_s + e.to_s' – rampion

-1

que estaba buscando una solución a este today.I encontraron esta question.This fue mi solución.

array = ["marblecake", "also", "the", 1337]; 
arrayString = '' 

array.each{|x| arrayString += "%" + x + "__"} 
+0

Desafortunadamente, esto solo funciona con arreglos de cadenas. –

10

Aunque esto es muy vieja pregunta, me gustaría añadir lo siguiente:

a.any? && "%".+(a.join("__%")) 
+0

¡Esa es una solución inteligente! Me gusta mucho :) –

+0

si 'a' está vacío, entonces esto solo arrojará'% ' – xiaoboa

Cuestiones relacionadas