Apa cara terbaik untuk menemukan jika string dimulai dengan yang lain di Ruby (tanpa rel)?
Apa cara terbaik untuk menemukan jika string dimulai dengan yang lain di Ruby (tanpa rel)?
Jawaban:
puts 'abcdefg'.start_with?('abc') #=> true
[Sunting] Ini adalah sesuatu yang saya tidak tahu sebelum pertanyaan ini: start_with
mengambil beberapa argumen.
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
start_with?
, tetapi MRI 1.9 tidak, seperti halnya Rails.
String#start_with?
.
start_with?
. Saya rasa saya salah ketik ketika saya memuat irb untuk mencobanya.
starts_with?
, yang dalam 1.8.7 dan di atas hanya alias start_with?
.
Karena ada beberapa metode yang disajikan di sini, saya ingin mencari tahu mana yang tercepat. Menggunakan 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
Jadi sepertinya itu start_with?
yang tercepat dari kelompok itu.
Hasil yang diperbarui dengan Ruby 2.2.2p95 dan mesin yang lebih baru:
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")
.
Metode yang disebutkan oleh steenslag sangat singkat, dan dengan lingkup pertanyaan itu harus dianggap jawaban yang benar. Namun perlu juga diketahui bahwa ini dapat dicapai dengan ekspresi reguler, yang jika Anda belum terbiasa dengan Ruby, adalah keterampilan penting untuk dipelajari.
Selamat bermain dengan Rubular: http://rubular.com/
Tetapi dalam kasus ini, pernyataan ruby berikut akan mengembalikan true jika string di sebelah kiri dimulai dengan 'abc'. The \ A dalam regex literal di sebelah kanan berarti 'awal dari string'. Bermainlah dengan rubular - akan menjadi jelas bagaimana segala sesuatu bekerja.
'abcdefg' =~ /\Aabc/
saya suka
if ('string'[/^str/]) ...
[/\Astr/]
sini. Regex Anda juga cocok "another\nstring"
.