首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ruby中模仿Finder/Mac OS的复制?

如何在ruby中模仿Finder/Mac OS的复制?
EN

Stack Overflow用户
提问于 2021-01-25 08:46:54
回答 1查看 46关注 0票数 1

在尝试实现类似于MAC OS Finder的ruby复制机制时,我遇到了一个有趣的问题。我需要尝试执行以下操作。我有一个包含以下字段的ruby对象:

代码语言:javascript
复制
 song.title = 'RocketMan'
 song.slug = 'rocket-man'

Mongoid Slug的帮助下,如果我要.clone上面的对象,我会得到下面的结果。slug由mongoid-slug gem功能设置。

代码语言:javascript
复制
 song.title = 'RocketMan'
 song.slug = 'rocket-man-1'

我遇到的麻烦是试图实现一个Mac类型的复制机制,我会模仿下面的算法。对于MAC OS Finder,需要注意的重要一点是,我要复制的任何文件都会产生下一个增量。

代码语言:javascript
复制
file.jpg
file copy.jpg
file copy 1.jpg
file copy 2.jpg

因此,如果我要复制上面的任何文件,后面的文件将是file copy 3.jpg

现在对于这个问题,我基本上是在尝试用ruby.For复制下面的例子,请注意“原始对象”,它在这个问题中起着重要的作用。

代码语言:javascript
复制
##### ORIGINAL #####
song.title = 'RocketMan'
song.slug = 'rocket-man'

#.clone 

song.title = 'RocketMan'
song.slug = 'rocket-man-1'

如果我对原始的ruby对象执行clone操作,我会得到以下结果:

代码语言:javascript
复制
song.title = 'RocketMan'
song.slug = 'rocket-man-2'

如果我使用slug rocket-man-1clone对象,将会产生以下结果。

代码语言:javascript
复制
song.title = 'RocketMan'
song.slug = 'rocket-man-1-1'

如果再克隆一次,我会得到'rocket-man-1-2‘等等。

有没有什么gem或算法可以用来模仿MAC OS Finder的功能?在我看来,无论我在mac os中使用什么文件或它的副本来复制,我都会得到正确的增量。使用ruby和mongoid-slug,如果我想模仿Finder,我只需要克隆原始对象。我正在处理的这个项目中的用户可以克隆原始和/或克隆。如果他们复制副本,那么整个命名约定就不起作用了。

如果任何人有一些见解,我将不胜感激。此外,只是为了澄清一下,插件的生成并不重要。我最感兴趣的是尝试通过复制创建以下标题:

代码语言:javascript
复制
Rocket Man
Rocket Man Copy
Rocket Man Copy 2
Rocket Man Copy 3

等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-25 22:21:58

您可以使用正则表达式来匹配给定的标题并生成后续的标题:

代码语言:javascript
复制
def next_title(title)
  case title
  when /(.*) Copy (\d*[1-9]\d*)\z/
    "#{$1} Copy #{$2.to_i.succ}"
  when /(.*) Copy\z/
    "#{$1} Copy 2"
  else
    "#{title} Copy"
  end
end

next_title("Rocket Man")         #=> "Rocket Man Copy"
next_title("Rocket Man Copy")    #=> "Rocket Man Copy 2"
next_title("Rocket Man Copy 2")  #=> "Rocket Man Copy 3"

它还可以像Finder一样处理几种边缘情况:

代码语言:javascript
复制
next_title("Rocket Man Copy 1")   #=> "Rocket Man Copy 2"
next_title("Rocket Man Copy 02")  #=> "Rocket Man Copy 3"
next_title("Rocket Man Copy 0")   #=> "Rocket Man Copy 0 Copy"
next_title("Rocket Man Copy -1")  #=> "Rocket Man Copy -1 Copy"
next_title("Copy")                #=> "Copy Copy"
next_title("Copy 2")              #=> "Copy 2 Copy"

为了确保标题的唯一性,您必须重复调用next_title,直到找到一个不存在的标题,例如:

代码语言:javascript
复制
title = "Rocket Man"
title = next_title(title) while Song.exists?(title: title)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65877584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档