如何从另一个Ruby文件执行Ruby文件

如何从另一个Ruby文件执行Ruby文件,ruby,Ruby,如何从另一个Ruby文件执行Ruby文件 class Launch def get_program begin files = ["sum_of_digits", "compressed_sequence", "shortest_repetition"] (0...files.length).each_with_index do |index| puts "#{index} . #{ files[index]}"

如何从另一个Ruby文件执行Ruby文件

class Launch
  def get_program
    begin
      files = ["sum_of_digits", "compressed_sequence", 
              "shortest_repetition"]
      (0...files.length).each_with_index do |index|
        puts "#{index} . #{ files[index]}"
      end  
      begin
        puts "Enter program number to execute: "
        puts program_number = gets.chomp.to_i   
        puts "loading program #{files[program_number]}"
        begin
          load(`ruby #{files[program_number]}.rb 
              #{files[program_number]}.txt`)
        rescue
          puts "loading error"
          end
        puts "do you want to continue Y/N"
        answer = gets.chomp
      end until answer == 'N'                       
    rescue
      puts "the file cannot be loaded ,it may be moved or not exist "
    end
  end
end

launch = Launch.new
launch.get_program

launch = Launch.new
launch.get_program

执行时,我得到输出,但只有一个程序,循环终止。我希望在循环中执行文件,直到用户输入“N”。

通常,您的代码不是以Ruby方式编写的。这是未经测试的,但看起来是正确的:

class Launch

  FILES = ['sum_of_digits', 'compressed_sequence', 'shortest_repetition']

  def get_program
    FILES.each_with_index do |fname, i|
      puts "#{i} . #{fname}"
    end  

    loop do
      puts "Enter program number to execute: "
      program_number = gets.to_i   
      file_to_load = FILES[program_number]
      puts "loading program #{file_to_load}"

      begin
        system("ruby #{file_to_load}.rb #{file_to_load}.txt")
      rescue => e
        puts "loading error: #{e}"
        puts "'#{file_to_load}' cannot be loaded, it may have been moved or not exist."
      end

      puts 'Do you want to continue Y/N'
      break if gets.chomp.strip.upcase == 'N'
    end
  end
end

launch = Launch.new
launch.get_program
一些需要研究的东西:

  • block
    end
    用于定义控制回路,而不是用于定义控制回路。嗯,他们可以,但是有更好、更地道的方法
  • 你用过,但我不认为那是你真正想做的。相反,您应该告诉操作系统在子shell中使用加载和运行代码,而不是在当前运行的代码的上下文中
  • 您的代码应该至少使用
    rescue=>e
    捕获异常,而不是使用裸
    rescue
    ,这样您就可以输出发生的情况。在“真实生活”中,也就是在生产中,你应该更加敏锐,只捕捉你期望的例外情况,但这是一个不同的讨论
  • 当使用
    开始
    /
    救援
    /
    结束
    时,尽量使它们尽可能小,至少在您更熟悉它们的工作方式之前<代码>救援是一种打击自己的好方法,调试由多行代码生成的引发的异常可能是一件痛苦的事情

通常,当您有一个可能发生更改的列表,或任何比代码其余部分更可能发生更改的变量时,请将该定义放在脚本的顶部,或类或模块定义的顶部,然后将其作为常量引用。这有助于避免在代码中撒上神奇的灰尘,如果你想添加或删除东西,就必须搜索这些代码。像文件。或者神奇的灰尘。

system()
?为什么循环在
加载
调用之前结束?