0

我有以下 ruby​​ 代码,它按 each 拆分字符串'/',将每个拆分分配给一个变量,在最后一个字符串之后立即插入另一个字符串'/',然后在将它们分配给变量的同时重新加入所有字符串。

    object = "uploads/video/screenshot/74/DGSCFUA_video.jpg"
    up, vid, pic, num, file = object.split('/')
    file = "#{up}/#{vid}/#{pic}/#{num}/#{file.insert(0, "mini_")}"
    p file

    >> "uploads/video/screenshot/74/mini_DGSCFUA_video.jpg"

虽然这有效,但感觉就像我错过了一个技巧,这不是最有效的做事方式。

是否可以在最后拆分一个字符串'/'(i.e. object.split('/')[-1])但捕获拆分的两个部分,而不仅仅是后面的字符'/'

4

3 回答 3

5

您正在按摩文件路径,因此请使用为该任务制作的工具:

path_to_file = "uploads/video/screenshot/74/DGSCFUA_video.jpg"

file_path, file_name = File.split(path_to_file) 
# => ["uploads/video/screenshot/74", "DGSCFUA_video.jpg"]

或者,您可以像这样拆分:

file_path, file_name = File.dirname(path_to_file), File.basename(path_to_file) 
# => ["uploads/video/screenshot/74", "DGSCFUA_video.jpg"]

然后使用以下命令构建新路径:

path_to_file = File.join(file_path, "mini_#{ file_name }") 
# => "uploads/video/screenshot/74/mini_DGSCFUA_video.jpg"

优点是,Ruby 的IO类,它是 File 的祖先,在确定路径分隔符时会考虑操作系统,因此如果代码在 Windows 或 *nix 上运行,它将做正确的事情。

如果可能,Ruby 将在不同的操作系统约定之间转换路径名。例如,在 Windows 系统上,文件名“/gumby/ruby/test.rb”将打开为“\gumby\ruby\test.rb”。在 Ruby 字符串中指定 Windows 样式的文件名时,请记住转义反斜杠:

"c:\\gumby\\ruby\\test.rb"
于 2013-08-31T01:52:24.903 回答
1

我会走这条路-

str = "uploads/video/screenshot/74/DGSCFUA_video.jpg"
ar = File.split(str) # => ["uploads/video/screenshot/74", "DGSCFUA_video.jpg"]
ar[-1] = ar[-1].prepend("mini_")
File.join(*ar)
# => "uploads/video/screenshot/74/mini_DGSCFUA_video.jpg"
于 2013-08-30T22:25:21.820 回答
1

正则表达式可能更灵活、更可重用:

 s = 'uploads/video/screenshot/74/DGSCFUA_video.jpg'
 s.scan(/(.*)\/(.*)/)
 => [["uploads/video/screenshot/74", "DGSCFUA_video.jpg"]]
于 2013-08-30T22:37:36.340 回答