【发布时间】:2017-08-18 23:31:13
【问题描述】:
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 需要的东西,因为我只知道。如果一个程序需要很多输入而我们无法预测顺序怎么办?我发现
STDOUT.flush是否在sum.rb中的每个puts之后添加,robot.rb可以运行。但实际上我们不能相信sum.rb的作者可以加STDOUT.flush,对吧?
感谢您的宝贵时间!
【问题讨论】: