sum.rb
很简单。您输入两个数字,它会返回总和。
# sum.rb
puts "Enter number A"
a = gets.chomp
puts "Enter number B"
b = gets.chomp
puts "sum is #{a.to_i + b.to_i}"
robot.rb
用来Open3.popen3
交互sum.rb
。这是代码:
# robot.rb
require 'open3'
Open3.popen3('ruby sum.rb') do |stdin, stdout, stderr, wait_thr|
while line = stdout.gets
if line == "Enter number A\n"
stdin.write("10\n")
elsif line == "Enter number B\n"
stdin.write("30\n")
else
puts line
end
end
end
robot.rb
未能运行。似乎它卡在了sum.rb
's gets.chomp
。
后来我发现我必须写如下才能使它工作。您需要事先以正确的顺序输入输入。
# robot_2.rb
require 'open3'
Open3.popen3('ruby sum.rb') do |stdin, stdout, stderr, wait_thr|
stdin.write("10\n")
stdin.write("30\n")
puts stdout.read
end
让我感到困惑的是:
robot_2.rb
不像与 shell 交互,它更像是提供 shell 需要的东西,因为我只知道。如果一个程序需要很多输入而我们无法预测顺序怎么办?我发现如果
STDOUT.flush
在每个puts
in之后添加sum.rb
,robot.rb
可以运行。但实际上我们不能相信sum.rb
作者可以添加STDOUT.flush
,对吗?
谢谢你的时间!