web-dev-qa-db-fra.com

Comment savoir si une chaîne commence par une autre chaîne en Ruby?

Quelle est la meilleure façon de savoir si une chaîne commence par une autre dans Ruby (sans Rails)?

142
Guillaume Coté
puts 'abcdefg'.start_with?('abc')  #=> true

[edit] C'est quelque chose que je ne connaissais pas avant cette question: start_with prend plusieurs arguments.

'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
237
steenslag

Puisqu'il existe plusieurs méthodes présentées ici, je voulais savoir laquelle était la plus rapide. Utilisation de Ruby 1.9.3p362:

irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> Benchmark.realtime { 1.upto(10000000) { "foobar"[/\Afoo/] }}
=> 12.477248
irb(main):003:0> Benchmark.realtime { 1.upto(10000000) { "foobar" =~ /\Afoo/ }}
=> 9.593959
irb(main):004:0> Benchmark.realtime { 1.upto(10000000) { "foobar"["foo"] }}
=> 9.086909
irb(main):005:0> Benchmark.realtime { 1.upto(10000000) { "foobar".start_with?("foo") }}
=> 6.973697

Donc, ça ressemble à start_with?est le plus rapide du groupe.

Mise à jour des résultats avec Ruby 2.2.2p95 et une machine plus récente:

require 'benchmark'
Benchmark.bm do |x|
  x.report('regex[]')    { 10000000.times { "foobar"[/\Afoo/] }}
  x.report('regex')      { 10000000.times { "foobar" =~ /\Afoo/ }}
  x.report('[]')         { 10000000.times { "foobar"["foo"] }}
  x.report('start_with') { 10000000.times { "foobar".start_with?("foo") }}
end

            user       system     total       real
regex[]     4.020000   0.000000   4.020000 (  4.024469)
regex       3.160000   0.000000   3.160000 (  3.159543)
[]          2.930000   0.000000   2.930000 (  2.931889)
start_with  2.010000   0.000000   2.010000 (  2.008162)
53
haslo

La méthode mentionnée par steenslag est concise et, compte tenu de la portée de la question, elle devrait être considérée comme la bonne réponse. Toutefois, il est également utile de savoir que cela peut être réalisé avec une expression régulière, qui est une compétence importante à acquérir si vous n'êtes pas déjà familiarisé avec Ruby.

Avoir un jeu avec Rubular: http://rubular.com/

Mais dans ce cas, l'instruction suivante Ruby renverra true si la chaîne de gauche commence par 'abc'. Le\A dans le littéral de regex de droite signifie 'le début de la chaîne Ayez un jeu avec rubular - il deviendra clair comment les choses fonctionnent.

'abcdefg' =~  /\Aabc/ 
4
pakeha

J'aime

if ('string'[/^str/]) ...
2
the Tin Man