Quelle est la meilleure façon de savoir si une chaîne commence par une autre en Ruby (sans rails)?
Quelle est la meilleure façon de savoir si une chaîne commence par une autre en Ruby (sans rails)?
Réponses:
puts 'abcdefg'.start_with?('abc') #=> true
[modifier] C'est quelque chose que je ne savais pas avant cette question: start_with
prend plusieurs arguments.
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
start_with?
, mais l'IRM 1.9 le fait, tout comme Rails.
String#start_with?
start_with?
. Je suppose que je l'ai tapé quand j'ai chargé irb pour l'essayer.
starts_with?
, qui dans 1.8.7 et au-dessus est juste aliasée start_with?
.
Puisqu'il y a plusieurs méthodes présentées ici, je voulais savoir laquelle était la plus rapide. En utilisant 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
Il semble donc que ce soit start_with?
le plus rapide du peloton.
Résultats mis à jour 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)
"FooBar".downcase.start_with?("foo")
.
La méthode mentionnée par steenslag est laconique et compte tenu de la portée de la question, elle doit être considérée comme la bonne réponse. Cependant, il est également intéressant de savoir que cela peut être réalisé avec une expression régulière, qui, si vous n'êtes pas déjà familier avec Ruby, est une compétence importante à apprendre.
Jouez avec Rubular: http://rubular.com/
Mais dans ce cas, l'instruction ruby suivante retournera true si la chaîne de gauche commence par «abc». Le \ A dans le littéral regex à droite signifie «le début de la chaîne». Jouez avec rubular - il deviendra clair comment les choses fonctionnent.
'abcdefg' =~ /\Aabc/
J'aime
if ('string'[/^str/]) ...
[/\Astr/]
ici. Votre regex correspond également "another\nstring"
.