Слишком много вложений в рубине? - PullRequest
3 голосов
/ 23 августа 2011

Конечно, должен быть лучший способ сделать это:

File.open('Data/Networks/to_process.txt', 'w') do |out|
  Dir['Data/Networks/*'].each do |f|
    if File.directory?(f)
      File.open("#{f}/list.txt").each do |line|
        out.puts File.basename(f) + "/" + line.split(" ")[0]
      end
    end
  end
end 

Ура! * * 1004

Ответы [ 4 ]

8 голосов
/ 23 августа 2011

Вы можете избавиться от 1 уровня вложенности, используя шаблон Guard Clause:

File.open('Data/Networks/to_process.txt', 'w') do |out|
  Dir['Data/Networks/*'].each do |f|
    next unless File.directory?(f)
    File.open("#{f}/list.txt").each do |line|
      out.puts File.basename(f) + "/" + line.split(" ")[0]
    end
  end
end

См. Статья Джеффа Этвуда об этом подходе.

6 голосов
/ 23 августа 2011

ИМХО, в вашем коде нет ничего плохого, но вы можете выполнить глобализацию каталога и проверку из if в одном выражении, сохранив один уровень вложенности:

Dir.glob('Data/Networks/*').select { |fn| File.directory?(fn) }.each do |f|
  ...
end
3 голосов
/ 23 августа 2011

Поскольку вы ищете определенный файл в каждом из каталогов, просто позвольте Dir#[] найти их для вас, полностью избавляя от необходимости проверять каталог.Кроме того, IO#puts примет массив, поместив каждый элемент в новую строку.Это избавит от еще одного уровня вложенности.

File.open('Data/Networks/to_process.txt', 'w') do |out|
  Dir['Data/Networks/*/list.txt'] do |file|
    dir = File.basename(File.dirname(file))
    out.puts File.readlines(file).map { |l| "#{dir}/#{l.split.first}" }
  end
end
1 голос
/ 24 августа 2011

Сокращение вложенности немного путем отделения ввода от вывода:

directories = Dir['Data/Networks/*'].find_all{|f| File.directory?(f)}
output_lines = directories.flat_map do |f|
  output_lines_for_directory = File.open("#{f}/list.txt").map do |line|
    File.basename(f) + "/" + line.split(" ")[0]
  end
end
File.open('Data/Networks/to_process.txt', 'w') do |out|
  out.puts output_lines.join("\n")
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...