Bir dize Ruby'de (raylar olmadan) başka bir dizeyle başlıyorsa bulmanın en iyi yolu nedir?
Bir dize Ruby'de (raylar olmadan) başka bir dizeyle başlıyorsa bulmanın en iyi yolu nedir?
Yanıtlar:
puts 'abcdefg'.start_with?('abc') #=> true
Bu sorudan önce bilmediğim bir şey: start_with
birden fazla argüman alıyor.
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
start_with?
, ancak MRI 1.9'da olduğu gibi Rails de vardır.
String#start_with?
.
start_with?
. Sanırım denemek için irb yüklediğimde yazdım.
starts_with?
yukarıda 1.8.7 ve sadece diğer adı olan, start_with?
.
Burada sunulan birkaç yöntem olduğu için hangisinin en hızlı olduğunu bulmak istedim. Ruby 1.9.3p362'yi kullanma:
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
Öyle görünüyor start_with?
ki en hızlı grup ist.
Ruby 2.2.2p95 ve daha yeni bir makine ile güncellenmiş sonuçlar:
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")
.
Steenslag tarafından belirtilen yöntem kesiktir ve sorunun kapsamı doğru cevap olarak düşünülmelidir. Bununla birlikte, bunun Ruby'de zaten aşina değilseniz, öğrenmek için önemli bir beceri olan düzenli bir ifade ile elde edilebileceğini bilmeye değer.
Rubular ile bir oyun oynayın: http://rubular.com/
Ancak bu durumda, soldaki dize 'abc' ile başlarsa aşağıdaki ruby deyimi true değerini döndürür. Sağdaki regex değişmezindeki \ A, 'dizenin başlangıcı' anlamına gelir. Rubular ile bir oyun oynayın - işlerin nasıl çalıştığı netleşecek.
'abcdefg' =~ /\Aabc/
severim
if ('string'[/^str/]) ...
[/\Astr/]
Burada kullanmalısın . Normal ifadeniz de eşleşir "another\nstring"
.