删除字符串的第一个字符的最有效方法是什么?

use*_*097 13 ruby ruby-on-rails

我有一个字符串c1234- 删除字符串第一个字母的最有效,最快捷的方法是什么?

hal*_*dan 32

用途slice!:

s = "Hello"
s.slice!(0) #=> "ello"
Run Code Online (Sandbox Code Playgroud)

尝试一下irb:

ruby-1.9.3-p0 :001 > s = "Hello"
 => "Hello" 
ruby-1.9.3-p0 :002 > s.slice!(0) #=> "ello"
 => "H" 
ruby-1.9.3-p0 :003 > s
 => "ello" 
Run Code Online (Sandbox Code Playgroud)

  • 不,它返回"H"但从s中删除它. (10认同)

Ami*_*far 19

最好的解决方案是"foobar"[1..-1].不需要正则表达式.


KL-*_*L-7 19

说到效率,我从来没有很好的机会玩ruby的Benchmark模块,所以决定现在出于好奇心去做.这是基准:

require 'benchmark'

n = 10_000_000

s = 'c1234'

Benchmark.bm(8) do |x|
  x.report('slice!')  { n.times { s.dup.slice!(0) } }
  x.report('slice')   { n.times { s.dup.slice(1, 4) } }
  x.report('[1..-1]') { n.times { s.dup[1..-1] } }
  x.report('[1..4]')  { n.times { s.dup[1..4] } }
  x.report('reverse') { n.times { s.dup.reverse.chop.reverse } }
  x.report('gsub')    { n.times { s.dup.gsub(/^./, "") } }
  x.report('sub')     { n.times { s.dup.sub(/^./, "") } }
end
Run Code Online (Sandbox Code Playgroud)

结果如下:

              user     system      total        real
slice!    7.460000   0.000000   7.460000  (7.493322)
slice     6.880000   0.000000   6.880000  (6.902811)
[1..-1]   7.710000   0.000000   7.710000  (7.728741)
[1..4]    7.700000   0.000000   7.700000  (7.717171)
reverse  10.130000   0.000000  10.130000 (10.151716)
gsub     11.030000   0.000000  11.030000 (11.051068)
sub       9.860000   0.000000   9.860000  (9.880881)
Run Code Online (Sandbox Code Playgroud)

似乎slice是最明显的(至少对我来说)s[1..-1]s[1..4]稍微落后的最佳选择.使用reverse和regexp的解决方案对于这种任务看起来很复杂.


小智 10

选项1:

"abcd"[1..-1]
Run Code Online (Sandbox Code Playgroud)

选项2(更具描述性):

"abcd".last(-1)
Run Code Online (Sandbox Code Playgroud)

  • 选项 2 在 Rails 6 中被弃用,它给出了这个警告:`Calling String#last with a negative integer limit will raise an ArgumentError in Rails 6.1` (3认同)
  • 聪明的。(这不是一个很有价值的评论,但是这个答案在许多有用的答案池中没有得到关注。因为其他答案有很多活动,我觉得单次投票不足以表达我的真实想法感谢这个答案 - 所以我发表这个评论是希望围绕这个问题缺乏其他活动不太可能阻止人们认真对待答案。) (2认同)

War*_*Hog 5

有不止一种方法可以做到:)

"foobar".gsub(/^./, "")  # => "oobar"
Run Code Online (Sandbox Code Playgroud)