从Ruby / Rails中的路径字符串中删除最后一个路径目录

时间:2015-03-10 12:45:53

标签: ruby-on-rails ruby string

是否有简单快速操作只是在不使用正则表达式的情况下去除ruby中路径目录的最后一个路径?

路径示例:

has="/my/to/somewhere/id"
wants="/my/to/somewhere"

目前我正在使用:

path.split('/')[0...-1].join('/')

对于has我会永远知道id,所以我也可以使用:

path.sub("/#{id}", '')

所以我的问题是,哪个操作更快?

3 个答案:

答案 0 :(得分:4)

好吧,你可以使用Pathname#parent方法。

require 'pathname'

Pathname.new("/my/to/somewhere/id").parent
# => #<Pathname:/my/to/somewhere>
Pathname.new("/my/to/somewhere/id").parent.to_s
# => "/my/to/somewhere"

答案 1 :(得分:2)

使用Pathname比分裂快一点。在我的机器上,运行了一百万次:

require 'benchmark'
require 'pathname'

n = 1000000
id = "id"
Benchmark.bm do |x|
  x.report("pathname: ") { n.times { Pathname("/my/to/somewhere/id").dirname.to_s } }
  x.report("split:") { n.times { "/my/to/somewhere/id".split('/')[0...-1].join('/') } }
  x.report("path.sub:") { n.times { "/my/to/somewhere/id".sub("/#{id}", '') } }
end

我得到了以下结果:

              user     system      total        real
pathname:   1.550000   0.000000   1.550000 (  1.549925)
split:      1.810000   0.000000   1.810000 (  1.806914)
path.sub:   1.030000   0.000000   1.030000 (  1.030306)

答案 2 :(得分:1)

Pathname - split有一种方法,其中:

  

返回数组中的dirname和basename。

require 'pathname'

Pathname.new("/my/to/somewhere/id").split.first.to_s
# => "/my/to/somewhere"

希望有所帮助!