Jaki jest najlepszy sposób na sprawdzenie, czy ciąg znaków zaczyna się innym w Rubim (bez szyn)?
Jaki jest najlepszy sposób na sprawdzenie, czy ciąg znaków zaczyna się innym w Rubim (bez szyn)?
Odpowiedzi:
puts 'abcdefg'.start_with?('abc') #=> true
[edytuj] To jest coś, czego nie wiedziałem przed tym pytaniem: start_with
przyjmuje wiele argumentów.
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
start_with?
, ale MRI 1.9 tak, jak robi to Rails.
String#start_with?
.
start_with?
. Wydaje mi się, że pomyliłem się, kiedy załadowałem irb, aby spróbować.
starts_with?
, która w wersji 1.8.7 i nowszych jest aliasowana do start_with?
.
Ponieważ zaprezentowano tutaj kilka metod, chciałem dowiedzieć się, która z nich jest najszybsza. Używając 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
Wygląda na to, że start_with?
jest najszybszy z całej paczki.
Zaktualizowane wyniki dla Rubiego 2.2.2p95 i nowszej maszyny:
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")
.
Metoda, o której mówi steenslag, jest zwięzła i biorąc pod uwagę zakres pytania, należy ją uznać za poprawną odpowiedź. Jednak warto również wiedzieć, że można to osiągnąć za pomocą wyrażenia regularnego, którego, jeśli nie znasz jeszcze języka Ruby, jest ważną umiejętnością do nauczenia się.
Zagraj w Rubular: http://rubular.com/
Ale w tym przypadku następująca instrukcja ruby zwróci prawdę, jeśli ciąg po lewej stronie zaczyna się od „abc”. \ A w dosłownym wyrażeniu regularnym po prawej stronie oznacza „początek łańcucha”. Pobaw się rubularem - stanie się jasne, jak to działa.
'abcdefg' =~ /\Aabc/
podoba mi się
if ('string'[/^str/]) ...
[/\Astr/]
tutaj. Twoje wyrażenie regularne również pasuje "another\nstring"
.