Який найкращий спосіб знайти, якщо рядок починається з іншої в Ruby (без рейок)?
Який найкращий спосіб знайти, якщо рядок починається з іншої в Ruby (без рейок)?
Відповіді:
puts 'abcdefg'.start_with?('abc') #=> true
[редагувати] Це те, чого я не знав до цього питання: start_with
бере кілька аргументів.
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
start_with?
, але МРТ 1.9 робить, як і Рейки.
String#start_with?
.
start_with?
. Я думаю, я написав це, коли завантажував irb, щоб спробувати.
starts_with?
, що в 1.8.7 і вище просто псевдонім start_with?
.
Оскільки тут представлено кілька методів, я хотів з’ясувати, який із них був найшвидшим. Використання 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
Таким чином, схоже, що start_with?
ist найшвидший з цієї групи.
Оновлені результати за допомогою Ruby 2.2.2p95 та новішої машини:
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, є лаконічним, і зважаючи на обсяг питання, його слід вважати правильним. Однак також варто знати, що цього можна досягти за допомогою регулярного вираження, яке, якщо ви ще не знайомі з Рубі, є важливим навиком для навчання.
Пограйте з Rubular: http://rubular.com/
Але в цьому випадку наступний оператор ruby повернеться true, якщо рядок зліва починається з 'abc'. \ A в прямому знаку регулярного вираження означає "початок рядка". Пограти з рубуляром - стане зрозуміло, як все працює.
'abcdefg' =~ /\Aabc/
мені подобається
if ('string'[/^str/]) ...
[/\Astr/]
тут. Ваш регекс також відповідає "another\nstring"
.