Concatenación de cadenas vs. interpolación en Ruby

Estoy empezando a aprender Ruby (progtwigción por primera vez), y tengo una pregunta sintáctica básica con respecto a las variables y varias formas de escribir código.

El progtwig “Aprende a progtwigr” de Chris Pine me enseñó a escribir un progtwig básico como este …

num_cars_again= 2 puts 'I own ' + num_cars_again.to_s + ' cars.' 

Esto está bien, pero luego tropecé con el tutorial en ruby.learncodethehardway.com, y me enseñaron a escribir el mismo progtwig exacto así …

 num_cars= 2 puts "I own #{num_cars} cars." 

Ambos emiten la misma cosa, pero obviamente la opción 2 es una forma mucho más corta de hacerlo.

¿Hay alguna razón en particular por la que deba usar un formato sobre el otro?

Cada vez que TIMTOWTDI (hay más de una forma de hacerlo), debe buscar los pros y los contras. Usar “interpolación de cadenas” (la segunda) en lugar de “concatenación de cadenas” (la primera):

Pros:

  • Es menos tipeo
  • Llama automáticamente a to_s para ti
  • Más idiomático dentro de la comunidad de Ruby
  • Más rápido de lograr durante el tiempo de ejecución

Contras:

  • Llama automáticamente a to_s para ti (tal vez pensaste que tenías una cadena, y la representación to_s no es lo que querías, y oculta el hecho de que no era una cadena)
  • Requiere que uses " para delimitar tu cadena en lugar de ' (quizás tengas el hábito de usar ' , o que previamente escribiste una cadena usando eso y solo más tarde necesitarás usar la interpolación de cadenas)

Tanto la interpolación como la concatenación tienen su propia fuerza y ​​debilidad. A continuación di una referencia que demuestra claramente dónde usar la concatinación y dónde usar la interpolación.

 require 'benchmark' iterations = 1_00_000 firstname = 'soundarapandian' middlename = 'rathinasamy' lastname = 'arumugam' puts 'With dynamic new strings' puts '====================================================' 5.times do Benchmark.bm(10) do |benchmark| benchmark.report('concatination') do iterations.times do 'Mr. ' + firstname + middlename + lastname + ' aka soundar' end end benchmark.report('interpolaton') do iterations.times do "Mr. #{firstname} #{middlename} #{lastname} aka soundar" end end end puts '--------------------------------------------------' end puts 'With predefined strings' puts '====================================================' 5.times do Benchmark.bm(10) do |benchmark| benchmark.report('concatination') do iterations.times do firstname + middlename + lastname end end benchmark.report('interpolaton') do iterations.times do "#{firstname} #{middlename} #{lastname}" end end end puts '--------------------------------------------------' end 

Y debajo está el resultado de Benchmark

 Without predefined strings ==================================================== user system total real concatination 0.170000 0.000000 0.170000 ( 0.165821) interpolaton 0.130000 0.010000 0.140000 ( 0.133665) -------------------------------------------------- user system total real concatination 0.180000 0.000000 0.180000 ( 0.180410) interpolaton 0.120000 0.000000 0.120000 ( 0.125051) -------------------------------------------------- user system total real concatination 0.140000 0.000000 0.140000 ( 0.134256) interpolaton 0.110000 0.000000 0.110000 ( 0.111427) -------------------------------------------------- user system total real concatination 0.130000 0.000000 0.130000 ( 0.132047) interpolaton 0.120000 0.000000 0.120000 ( 0.120443) -------------------------------------------------- user system total real concatination 0.170000 0.000000 0.170000 ( 0.170394) interpolaton 0.150000 0.000000 0.150000 ( 0.149601) -------------------------------------------------- With predefined strings ==================================================== user system total real concatination 0.070000 0.000000 0.070000 ( 0.067735) interpolaton 0.100000 0.000000 0.100000 ( 0.099335) -------------------------------------------------- user system total real concatination 0.060000 0.000000 0.060000 ( 0.061955) interpolaton 0.130000 0.000000 0.130000 ( 0.127011) -------------------------------------------------- user system total real concatination 0.090000 0.000000 0.090000 ( 0.092136) interpolaton 0.110000 0.000000 0.110000 ( 0.110224) -------------------------------------------------- user system total real concatination 0.080000 0.000000 0.080000 ( 0.077587) interpolaton 0.110000 0.000000 0.110000 ( 0.112975) -------------------------------------------------- user system total real concatination 0.090000 0.000000 0.090000 ( 0.088154) interpolaton 0.140000 0.000000 0.140000 ( 0.135349) -------------------------------------------------- 

Conclusión

Si las cadenas ya están definidas y seguro de que nunca serán nulas, utilice la interpolación. Utilice la interpolación adecuada. Utilice la apropiada que dé como resultado un mejor rendimiento que una que sea fácil de sangrar.