Как написать метод (общий метод) в 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'
]