我是编写 ruby​​ 文件的新手

我用ruby脚本编写了一个任务,但是该任务中有很多重复的代码。所以我需要为此编写一个通用方法。

这是我在 ruby​​ 文件中的任务

    install_projects = [ 
  'Cooperativa.Hermes.Application.Host.Console', 
  'Cooperativa.Hermes.Denormalizer.Host.Console', 
  'Cooperativa.Hermes.WebApi.Host.Console',
]

setup_projects = [ 
  'Cooperativa.Hermes.Setup.Console' 
]

replay_projects = [
  'Cooperativa.Hermes.EventReplayer.Console'
]

task :restore do

 install_projects.each do |project|
    restore_folder = "#{install}/#{project}"
    FileUtils.rm_rf restore_folder
    FileUtils.cp_r("#{backup_folder}/#{project}", restore_folder)
  end  
  setup_projects.each do |project|
    restore_folder = "#{install}/#{project}"
    FileUtils.rm_rf restore_folder
    FileUtils.cp_r("#{backup_folder}/#{project}", restore_folder)
  end   
  replay_projects.each do |project|
    restore_folder = "#{install}/#{project}"
    FileUtils.rm_rf restore_folder
    FileUtils.cp_r("#{backup_folder}/#{project}", restore_folder)
  end    
end

 restore_folder = "#{install}/#{project}"
        FileUtils.rm_rf restore_folder
        FileUtils.cp_r("#{backup_folder}/#{project}", restore_folder)

上面的代码是重复的代码。

我需要重新分解为单独的方法或通用方法。我怎样才能做到这一点?你有什么想法吗?

如何在 ruby​​ 脚本中为我的任务编写方法?

有帮助吗?

解决方案

您可以:

#refactor the proc

anonymous = lambda do |project|
  restore_folder = "#{install}/#{project}"
  FileUtils.rm_rf restore_folder
  FileUtils.cp_r("#{backup_folder}/#{project}", restore_folder)
end

install_projects.each &anonymous
.

或循环一切:

( install_projects + setup_projects + replay_projects).each do |project|
. 否则,将所有内容提取到您可以拥有自己的方法和变量的类中如何?

class RestoreData

  attr_reader :install, :backup_root

  def initialize(install, backup_root)
    @install     = install
    @backup_root = backup_root
  end

  def call
    projects.each do |project|
      clean_project_folder(project)
      restore_backup(project)
    end   
  end

  private

  def clean_project_folder(project)
    FileUtils.rm_rf restore_folder(project)
  end

  def restore_backup(project)
    FileUtils.cp_r(backup_folder(project), restore_folder(project))
  end

  def backup_folder(project)
    "#{backup_root}/#{project}"
  end

  def restore_folder(project)
    "#{install}/#{project}"
  end

  def projects
    install_projects + setup_projects + replay_projects
  end

  def install_projects
    [
      'Cooperativa.Hermes.Application.Host.Console', 
      'Cooperativa.Hermes.Denormalizer.Host.Console', 
      'Cooperativa.Hermes.WebApi.Host.Console',
    ]
  end

  def setup_projects
    [ 
      'Cooperativa.Hermes.Setup.Console' 
    ]
  end

  def replay_projects
    [
      'Cooperativa.Hermes.EventReplayer.Console'
    ]
  end
end
.

和您的rake任务:

task :restore do
  RestoreData.new(install, backup_folder).call
end
.

其他提示

这是使用一个方法:

def do_restore(project, install, backup_folder)
  restore_folder = "#{install}/#{project}"
  FileUtils.rm_rf restore_folder
  FileUtils.cp_r("#{backup_folder}/#{project}", restore_folder)
end

task :restore do

  install_projects.each { |project| do_restore(project, install, backup_folder) }
  setup_projects.each { |project| do_restore(project, install, backup_folder) }
  replay_projects.each { |project| do_restore(project, install, backup_folder) }

end

虽然我认为这对你来说可能是一个更好的解决方案(正如@apneadiving所建议的):

(install_projects + setup_projects + replay_projects).each do |project|
  restore_folder = "#{install}/#{project}"
  FileUtils.rm_rf restore_folder
  FileUtils.cp_r("#{backup_folder}/#{project}", restore_folder)
end

由于您实际上是在迭代三个数组,做同样的事情,这就像将三个数组加在一起,然后迭代 加入 大批。要将两个数组连接在一起,可以使用 + 操作员 - [1,2]+[3,4]==[1,2,3,4], , 所以 install_projects + setup_projects + replay_projects 只是一长串项目串联在一起:

install_projects = [ 
  'Cooperativa.Hermes.Application.Host.Console', 
  'Cooperativa.Hermes.Denormalizer.Host.Console', 
  'Cooperativa.Hermes.WebApi.Host.Console',
]

setup_projects = [ 
  'Cooperativa.Hermes.Setup.Console' 
]

replay_projects = [
  'Cooperativa.Hermes.EventReplayer.Console'
]

(install_projects + setup_projects + replay_projects) == [
  'Cooperativa.Hermes.Application.Host.Console', 
  'Cooperativa.Hermes.Denormalizer.Host.Console', 
  'Cooperativa.Hermes.WebApi.Host.Console',
  'Cooperativa.Hermes.Setup.Console',
  'Cooperativa.Hermes.EventReplayer.Console'
]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top