如何查找一个string是否以Ruby中的其他string开头?

什么是最好的方式来find一个string开始与另一个在Ruby(没有轨道)?

puts 'abcdefg'.start_with?('abc') #=> true 

这是我在这个问题之前不知道的事情: start_with多个参数。

 'abcdefg'.start_with?( 'xyz', 'opq', 'ab') 

由于在这里提出了几种方法,我想弄清楚哪一个是最快的。 使用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) 

steenslag提到的方法是简洁的,考虑到问题的范围,它应该被认为是正确的答案。 不过也值得一提的是,这可以通过一个正则expression式来实现,如果您不熟悉Ruby,那么这是一个重要的学习技巧。

与Rubular玩: http: //rubular.com/

但是在这种情况下,如果左边的string以'abc'开始,下面的ruby语句将返回true。 正则expression式中的\ A表示“string的开始”。 和ruby玩一玩 – 事情会变得很清楚。

 'abcdefg' =~ /\Aabc/ 

我喜欢

 if ('string'[/^str/]) ...