81 votes

Concaténation de chaînes et interpolation en Ruby

Je commence tout juste à apprendre le Ruby (première fois de programmation), et ont une base syntaxique de la question en ce qui concerne les variables, et les différentes manières d'écrire le code.

Chris Pine "Apprendre à programmer" m'a appris à écrire un programme simple comme ça...

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

C'est bien, mais alors je suis tombé sur ce tutoriel sur ruby.learncodethehardway.com et on lui a appris à écrire le même programme exact comme ça...

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

Ils ont tous les deux la sortie de la même chose, mais, évidemment, l'option 2 est beaucoup plus court chemin à faire.

Est-il une raison particulière pourquoi je devrais utiliser un format de rapport à l'autre?

76voto

Phrogz Points 112337

Chaque fois que TIMTOWTDI (il n'y a plus d'une façon de le faire), vous devriez regarder les avantages et les inconvénients. À l'aide de la "chaîne de l'interpolation" (le deuxième) au lieu de "concaténation de chaîne" (la première):

Pour:

  • Moins de frappe
  • Appelle automatiquement to_s pour vous
  • Plus idiomatique au sein de la communauté Ruby
  • Plus rapide à accomplir au cours de l'exécution

Inconvénients:

  • Appelle automatiquement to_s (pour vous, vous pensiez peut-être vous avez eu une chaîne de caractères, et l' to_s de représentation n'est pas ce que tu voulais, et masque le fait que ce n'était pas une chaîne de caractères)
  • Requiert l'utilisation d' " pour délimiter votre chaîne au lieu d' ' (peut-être que vous avez l'habitude d'utiliser ', ou si vous avez tapé une chaîne à l'aide de qui, et plus tard, nécessaires à l'utilisation de la chaîne d'interpolation)

9voto

soundar Points 3499

Les deux interpolation et concatination a sa propre force et de faiblesse. Ci-dessous, j'ai donné un point de repère qui démontre clairement l'endroit où l'utilisation concatination et où l'utilisation de l'interpolation.

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

Et ci-dessous est le résultat du 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)
--------------------------------------------------

Conclusion

Si les chaînes sont déjà définis et assurez-vous qu'ils ne seront jamais nul utilisation concatination d'autre de l'interpolation.Utilisation appropriée qui permettra d'aboutir à de meilleures performances que celle qui est facile à mettre en retrait.

4voto

Martin Graham Points 61

@user1181898 - à mon humble avis, c'est parce qu'il est plus facile de voir ce qui se passe. @Phrogz point, chaîne d'interpolation appelle automatiquement le to_s pour vous. Comme un débutant, vous devez voir ce qui se passe "sous le capot", de sorte que vous découvrez le concept en opposition à l'apprentissage par cœur.

Pensez-y comme l'apprentissage des mathématiques. Vous apprenez le "long" dans le but de comprendre les concepts de sorte que vous pouvez prendre des raccourcis une fois que vous savez vraiment ce que vous faites. Je parle d'expérience b/c je ne suis pas aussi avancé dans Ruby encore, mais je l'ai fait assez d'erreurs pour informer les gens sur ce que ne pas le faire. Espérons que cette aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X