查找字符串是否在Ruby中以另一个开头(无轨)的最佳方法是什么?
参见stackoverflow.com/questions/4130364
—
Nakilon 2010年
查找字符串是否在Ruby中以另一个开头(无轨)的最佳方法是什么?
Answers:
puts 'abcdefg'.start_with?('abc') #=> true
[编辑]这是我在问这个问题之前不知道的事情:start_with
需要多个参数。
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
start_with?
,但MRI 1.9和Rails一样。
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?
是最快的。
使用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提到的方法很简洁,鉴于问题的范围,应将其视为正确的答案。但是,也值得知道的是,可以通过正则表达式来实现,如果您对Ruby不熟悉,那么正则表达式是一项重要的学习技能。
玩Rubular:http: //rubular.com/
但是在这种情况下,如果左侧的字符串以'abc'开头,则以下ruby语句将返回true。右侧正则表达式文字中的\ A表示“字符串的开头”。玩一玩rubular-事情会变得很清楚。
'abcdefg' =~ /\Aabc/