如何从其他Ruby文件执行Ruby文件?
target
执行时,我收到输出,但只有一个程序,循环正在终止。我想循环执行文件,直到用户输入" N"。
答案 0 :(得分:0)
通常,您的代码不是以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
用于start exception handling,而不是用于定义控制循环。好吧,他们可以,但有更好,更惯用的方式。 loop
is recommended by Matz。load
,但我并不认为这是您真正想做的事情。相反,您应该告诉操作系统使用system
在子shell中加载和运行代码,而不是在当前运行的代码的上下文中。rescue
来捕获异常,而不是使用裸rescue => e
,因此您可以输出发生的内容。在"现实生活",AKA,制作中,你应该更加挑剔,只捕捉你期望的例外,但这是一个不同的讨论。begin
/ rescue
/ end
时,尽量让它们尽可能小,至少在您更熟悉它们的工作方式之前。 rescue
是一种很好的方法,可以让自己陷入困境,调试可能由多行代码生成的异常可能是一种痛苦。通常,如果您有可能更改的内容列表,或者任何比其他代码更可能更改的变量,请将该定义放在脚本的顶部,或类或模块定义的顶部,然后将其作为常量引用。如果你想添加或删除东西,这有助于避免在必须搜索的代码中撒上神奇的灰尘。喜欢文件。还是神奇的尘埃。