Qual a melhor maneira de descobrir se uma string começa com outra em Ruby (sem trilhos)?
Qual a melhor maneira de descobrir se uma string começa com outra em Ruby (sem trilhos)?
Respostas:
puts 'abcdefg'.start_with?('abc') #=> true
[editar] Isso é algo que eu não sabia antes desta pergunta: start_with
leva vários argumentos.
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
start_with?
, mas a MRI 1.9 possui, assim como o Rails.
String#start_with?
.
start_with?
. Acho que digitei quando carreguei o irb para experimentá-lo.
starts_with?
, que em 1.8.7 e acima é apenas um alias para start_with?
.
Como existem vários métodos apresentados aqui, eu queria descobrir qual era o mais rápido. Usando 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
Então parece que não start_with?
é o mais rápido do grupo.
Resultados atualizados com o Ruby 2.2.2p95 e uma máquina mais 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")
.
O método mencionado por steenslag é conciso e, dado o escopo da pergunta, deve ser considerada a resposta correta. No entanto, também vale a pena saber que isso pode ser alcançado com uma expressão regular, que, se você ainda não está familiarizado com Ruby, é uma habilidade importante para aprender.
Jogue com Rubular: http://rubular.com/
Mas, neste caso, a seguinte instrução ruby retornará true se a string à esquerda começar com 'abc'. O \ A no literal da regex à direita significa 'o início da string'. Brinque com a rubular - ficará claro como as coisas funcionam.
'abcdefg' =~ /\Aabc/
Eu gosto
if ('string'[/^str/]) ...
[/\Astr/]
aqui. Sua regex também corresponde "another\nstring"
.