manejo - ¿Cómo puedo saber si una cadena comienza con otra cadena en Ruby?
interpolar en ruby (4)
¿Cuál es la mejor manera de encontrar si una cuerda comienza con otra en Ruby (sin rieles)?
Como hay varios métodos presentados aquí, quería saber cuál fue el más 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
Entonces parece que start_with?
Es el más rápido del grupo.
Resultados actualizados con Ruby 2.2.2p95 y una máquina más nueva:
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)
El método mencionado por steenslag es escueto, y dado el alcance de la pregunta, debe considerarse la respuesta correcta. Sin embargo, también vale la pena saber que esto se puede lograr con una expresión regular, que si no estás familiarizado con Ruby, es una habilidad importante para aprender.
Juega con Rubular: http://rubular.com/
Pero en este caso, la siguiente declaración de ruby devolverá verdadero si la cadena de la izquierda comienza con ''abc''. El / A en el literal de expresión regular a la derecha significa ''el comienzo de la cadena''. Juega con rublos: quedará claro cómo funcionan las cosas.
''abcdefg'' =~ //Aabc/
me gusta
if (''string''[/^str/]) ...
puts ''abcdefg''.start_with?(''abc'') #=> true
[edit] Esto es algo que no sabía antes de esta pregunta: start_with
toma múltiples argumentos.
''abcdefg''.start_with?( ''xyz'', ''opq'', ''ab'')