Как написать метод (общий метод) в ruby

Я новый парень для записи файла 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 ​​для моей задачи?

2 ответа

Решение

Вы также можете:

#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

и ваша задача по граблям:

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'
]
Другие вопросы по тегам