如何从另一种方法中获取结果

时间:2015-11-16 14:25:35

标签: ruby

我有一个包含子目录的目录结构:

../../../../../MY_PROJECT/TEST_A/cats/
../../../../../MY_PROJECT/TEST_B/dogs/
../../../../../MY_PROJECT/TEST_A/tigers/
../../../../../MY_PROJECT/TEST_A/elephants/

每个文件都有一个以".sln"结尾的文件:

../../../../../MY_PROJECT/TEST_A/cats/cats.sln
../../../../../MY_PROJECT/TEST_B/dogs/dogs.sln
...

这些文件包含特定于其目录的信息。我想做以下事情:

  1. 在每个子目录中创建一个文件"myfile.txt",并为它们写一些字符串:

    ../../../../../MY_PROJECT/TEST_A/cats/myfile.txt
    ../../../../../MY_PROJECT/TEST_B/dogs/myfile.txt
    ../../../../../MY_PROJECT/TEST_A/tigers/myfile.txt
    ../../../../../MY_PROJECT/TEST_A/elephants/myfile.txt
    
  2. 使用以下方法将".sln"文件中的特定字符串复制到某些目录的myfile.txt

    def parse_sln_files
      sln_files = Dir["../../../../../MY_PROJECT/TEST_*/**/*.sln"]
      sln_files.each do |file_name|
        File.open(file_name) do |f|
          f.each_line { |line|
            if line =~ /C Source files ="..\\/                                   #"
              path = line.scan(/".*.c"/)
              puts path
            end
          }
        end
      end
    end
    
  3. 我想做这样的事情:

    def create_myfile
      Dir['../../../../../MY_PROJECT/TEST_*/*/'].each do |dir|
        File.new File.join(dir, 'myfile.txt'), 'w+'
        Dir['../../../../../TEST/TEST_*/*/myfile.txt'].each do |path|
          File.open(path,'w+') do |f|
            f.puts "some text...."
            f.puts "some text..."
            f.puts # here I would like to return the result of parse_sln_files
          end
        end
      end
    end
    

    有关如何表达这一点的任何建议吗?

1 个答案:

答案 0 :(得分:1)

您似乎希望从Visual C ++解决方案文件中读取C文件名列表,并将其存储在同一目录中的单独文件中。您可能必须合并代码中显示的两个循环,并执行以下操作:

def parse_sln_and_store_source_files
  sln_files = Dir["../../../../../MY_PROJECT/TEST_*/**/*.sln"]
  sln_files.each do |file_name|

    #### Lets collect source file names in this array
    source_file_names = []

    File.open(file_name) do |f|
      f.each_line { |line|
        if line =~ /C Source files ="..\\/                                  #"
          path = line.scan(/".*.c"/)

          ############ Add path to array ############
          source_file_names << path
        end
      }
    end

    #### lets create `myfile.txt` in same dir as that of .sln     
    test_file = File.expand_path(File.dirname(file_name)) + "/myfile.txt"

    File.open(test_file,'w+') do |f|
        f.puts "some text...."
        f.puts "some text..."

        ##### Iterate over source file names & write to file
        source_file_names.each { |n| f.puts n }
    end

  end
end

这可以更优雅地完成,只需更少的重构。另请注意,这不是经过测试的代码,希望您能得到我所建议的要点。