我需要做这样的事情。
10.times do |i|
file = File.open("./data/#{i+1}.in")
$stdin = file.read
load 'sum.rb'
file.close
end
这是sum.rb
gets.chomp.split().map { |e| e.to_i }
puts array.inject(:+)
有没有办法解决这个问题?
答案 0 :(得分:2)
$stdin
且File.open
的结果都是IO
个对象,因此,不是将file.read
的结果分配给$stdin
,而是指定file
本身。
10.times do |i|
file = File.open("./data/#{i+1}.in")
$stdin = file
load 'sum.rb'
file.close
end
这将解决您的直接问题,sum.rb
将无法正常工作(array
未在任何地方定义。)
在更强大的版本中,您可能希望保留$stdin
的原始值并在完成后重置它。
答案 1 :(得分:1)
也许有一种更简单的方法,但如果你不介意将sum.rb生成为一个新进程(可以更好地模拟测试),你可以这样做:
require "open3"
10.times do |i|
File.open("./data/#{i+1}.in") do |file|
Open3.popen2e("ruby sum.rb") do |stdin, stdout, wait_thr|
stdin.puts(file.read)
exit_status = wait_thr.value # Process::Status object returned.
end
end
end
Doc:http://ruby-doc.org/stdlib-2.1.0/libdoc/open3/rdoc/Open3.html#method-c-popen2e