Qual è il modo migliore per scoprire se una stringa inizia con un'altra in Ruby (senza binari)?
Qual è il modo migliore per scoprire se una stringa inizia con un'altra in Ruby (senza binari)?
Risposte:
puts 'abcdefg'.start_with?('abc') #=> true
[modifica] Questo è qualcosa che non conoscevo prima di questa domanda: start_with
accetta più argomenti.
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
start_with?
, ma la risonanza magnetica 1.9, così come Rails.
String#start_with?
.
start_with?
. Immagino di averlo scritto in modo errato quando ho caricato irb per provarlo.
starts_with?
, che in 1.8.7 e versioni successive è solo alias start_with?
.
Dato che ci sono molti metodi qui presentati, ho voluto capire quale fosse il più veloce. Utilizzando 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
Quindi sembra che sia start_with?
il più veloce del gruppo.
Risultati aggiornati con Ruby 2.2.2p95 e una macchina più recente:
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")
.
Il metodo citato da steenslag è conciso e, considerato lo scopo della domanda, dovrebbe essere considerata la risposta corretta. Tuttavia, vale anche la pena sapere che questo può essere ottenuto con un'espressione regolare, che se non si ha già familiarità con Ruby, è un'abilità importante da imparare.
Divertiti con Rubular: http://rubular.com/
Ma in questo caso, la seguente istruzione ruby restituirà vero se la stringa a sinistra inizia con 'abc'. Il carattere \ A nel regex letterale a destra significa "l'inizio della stringa". Gioca con Rubular - diventerà chiaro come funzionano le cose.
'abcdefg' =~ /\Aabc/
mi piace
if ('string'[/^str/]) ...
[/\Astr/]
qui. Anche la tua regex corrisponde "another\nstring"
.