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
的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 所需的内容,因为我只知道这些。如果一个程序需要很多输入,而我们无法预测顺序怎么办?我发现如果在
sum.rb
的每个puts
后面添加STDOUT.flush
,robot.rb
就可以运行了。但实际上我们不能相信sum.rb
的作者会添加STDOUT.flush
,对吗?