Was ist der beste Weg, um herauszufinden, ob eine Zeichenfolge in Ruby mit einer anderen beginnt (ohne Schienen)?
Was ist der beste Weg, um herauszufinden, ob eine Zeichenfolge in Ruby mit einer anderen beginnt (ohne Schienen)?
Antworten:
puts 'abcdefg'.start_with?('abc') #=> true
[bearbeiten] Dies ist etwas, was ich vor dieser Frage nicht wusste: start_with
nimmt mehrere Argumente.
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
start_with?
, MRT 1.9 ebenso wie Rails.
String#start_with?
.
start_with?
. Ich glaube, ich habe es getippt, als ich irb geladen habe, um es zu versuchen.
starts_with?
, auf die in Version 1.8.7 und höher nur ein Alias festgelegt ist start_with?
.
Da hier mehrere Methoden vorgestellt werden, wollte ich herausfinden, welche am schnellsten war. Verwenden von 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
Es sieht also so aus, als wäre es start_with?
der schnellste im ganzen Haufen.
Aktualisierte Ergebnisse mit Ruby 2.2.2p95 und einem neueren Computer:
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")
.
Die von steenslag erwähnte Methode ist knapp und sollte angesichts des Umfangs der Frage als die richtige Antwort angesehen werden. Es ist jedoch auch wichtig zu wissen, dass dies mit einem regulären Ausdruck erreicht werden kann. Wenn Sie mit Ruby noch nicht vertraut sind, ist dies eine wichtige Fähigkeit, die Sie erlernen müssen.
Spielen Sie mit Rubular: http://rubular.com/
In diesem Fall gibt die folgende Ruby-Anweisung jedoch true zurück, wenn die Zeichenfolge links mit 'abc' beginnt. Das \ A im Regex-Literal rechts bedeutet "der Anfang der Zeichenfolge". Spielen Sie mit Rubular - es wird klar, wie die Dinge funktionieren.
'abcdefg' =~ /\Aabc/
ich mag
if ('string'[/^str/]) ...
[/\Astr/]
hier verwenden. Ihre Regex stimmt auch überein "another\nstring"
.