Estoy buscando una forma más elegante de concatenar cuerdas en Ruby.
Tengo la siguiente línea:
source = "#{ROOT_DIR}/" << project << "/App.config"
¿Hay una mejor manera de hacer esto?
Y para el caso, ¿cuál es la diferencia entre <<
y +
?
ruby
string-concatenation
dagda1
fuente
fuente
Respuestas:
Puedes hacerlo de varias maneras:
<<
pero esa no es la forma habitualCon interpolación de cuerdas
con
+
El segundo método parece ser más eficiente en términos de memoria / velocidad de lo que he visto (aunque no medido). Los tres métodos arrojarán un error constante no inicializado cuando ROOT_DIR es nulo.
Cuando se trata de nombres de ruta, puede utilizar
File.join
para evitar desordenar con el separador de nombre de ruta.Al final, es cuestión de gustos.
fuente
El
+
operador es la opción de concatenación normal, y es probablemente la forma más rápida de concatenar cadenas.La diferencia entre
+
y<<
es que<<
cambia el objeto en su lado izquierdo, y+
no lo hace.fuente
+
y<<
va a ser casi lo mismo. Si está lidiando con muchas cadenas, o muy grandes, entonces puede notar una diferencia. Me sorprendió lo similares que se comportaron. gist.github.com/28953115.times do ... end
bloque) para cada intérprete, terminaría con resultados más precisos. Mis pruebas han demostrado que la interpolación es el método más rápido en todos los intérpretes de Ruby. Hubiera esperado<<
ser el más rápido, pero es por eso que hacemos una referencia.Si solo está concatenando rutas, puede usar el método File.join de Ruby.
fuente
de http://greyblake.com/blog/2012/09/02/ruby-perfomance-tricks/
Usar
<<
akaconcat
es mucho más eficiente que+=
, ya que este último crea un objeto temporal y anula el primer objeto con el nuevo objeto.salida:
fuente
Dado que esta es una ruta, probablemente usaría array y join:
fuente
Aquí hay otro punto de referencia inspirado en esta esencia . Compara la concatenación (
+
), el agregado (<<
) y la interpolación (#{}
) para cadenas dinámicas y predefinidas.salida:
Conclusión: la interpolación en MRI es pesada.
fuente
Prefiero usar Pathname:
sobre
<<
y+
desde documentos de ruby:+
: Devuelve una nueva cadena que contiene other_str concatenada a str<<
: Concatena el objeto dado a str. Si el objeto es un Fixnum entre 0 y 255, se convierte en un carácter antes de la concatenación.así que la diferencia está en lo que se convierte en el primer operando (
<<
realiza cambios en el lugar,+
devuelve una nueva cadena para que tenga más memoria) y qué ocurrirá si el primer operando es Fixnum (<<
se agregará como si fuera un carácter con un código igual a ese número,+
aumentará error)fuente
Pathname('/home/foo') + '/etc/passwd' # => #<Pathname:/etc/passwd>
. Esto es por diseño, basado en el ejemplo de rubydoc. Parece que File.join es más seguro.(Pathname(ROOT_DIR) + project + 'App.config').to_s
si desea devolver un objeto de cadena.Déjame mostrarte toda mi experiencia con eso.
Tuve una consulta que devolvió 32k de registros, para cada registro llamé a un método para formatear ese registro de la base de datos en una cadena formateada y luego concatenarlo en una cadena que al final de todo este proceso se convertirá en un archivo en el disco.
Mi problema fue que, según el registro, alrededor de 24k, el proceso de concatenación de la cadena se convirtió en un dolor.
Estaba haciendo eso usando el operador regular '+'.
Cuando cambié a '<<' fue como magia. Fue muy rápido
Entonces, recordé mis viejos tiempos, algo así como 1998, cuando estaba usando Java y concatenando String usando '+' y cambié de String a StringBuffer (y ahora nosotros, el desarrollador de Java tenemos el StringBuilder).
Creo que el proceso de + / << en el mundo Ruby es el mismo que + / StringBuilder.append en el mundo Java.
El primero reasigna todo el objeto en la memoria y el otro solo apunta a una nueva dirección.
fuente
Concatenación que dices? ¿Qué tal el
#concat
método entonces?Para ser justos,
concat
tiene alias como<<
.fuente
"foo" "bar" 'baz" #=> "foobarabaz"
Aquí hay más formas de hacer esto:
Y así ...
fuente
También puede usar
%
lo siguiente:Este enfoque también funciona con
'
comillas (simples).fuente
Puede usar
+
u<<
operador, pero en la.concat
función ruby es la más preferible, ya que es mucho más rápido que otros operadores. Puedes usarlo como.fuente
.
después de tu últimoconcat
no?La situación importa, por ejemplo:
En el primer ejemplo, la concatenación con el
+
operador no actualizará eloutput
objeto, sin embargo, en el segundo ejemplo, el<<
operador actualizará eloutput
objeto con cada iteración. Entonces, para el tipo de situación anterior,<<
es mejor.fuente
Puede concatenar en la definición de cadena directamente:
fuente
Para su caso particular, también podría usarlo
Array#join
al construir el tipo de ruta de archivo de la cadena:Esto tiene un efecto secundario agradable de convertir automáticamente diferentes tipos a cadenas:
fuente
Para títeres:
fuente