红宝石 - 从一个班级到另一个班级

时间:2014-11-25 14:34:41

标签: ruby pipe

我有一个名为Foo的类,它使用管道输入从命令行读取输入,它运行良好。我有另一个名为Bar的类,它调用Foo,并且必须以Foo期望的相同方式提供(管道输入)Foo,但它似乎不是为我工作。

请参阅下面的我的代码段。 我将不胜感激任何帮助。

注意: 我知道我可以通过将对象数据从Bar传递到Foo来避免这样做,但我想使用管道。

$ ls -x1
bar.rb
foo.rb
test.rb

$ cat *
# bar.rb
require "stringio"
class Bar
  def self.pipe
    input = StringIO.new
    input.write "bar"
    input.rewind
    $stdin = input
    Foo.print
    $stdin = STDIN
  end
end

# foo.rb
class Foo
  @@stdin = STDIN.tty? ? nil : $stdin.read #ok for cli pipe-in

  def self.print
    puts "stdin: #{@@stdin}"
  end
end

# test.rb
$:.unshift File.join(File.dirname(__FILE__))
require "foo"
require "bar"
Bar.pipe

$ echo "piped" | ruby test.rb 
stdin: piped

$ ruby test.rb 
stdin:

做错了什么,为什么?解决方案会很棒。

1 个答案:

答案 0 :(得分:0)

我发现了我的错误。我修改Foo如下,但我打破了它的功能。

$ cat foo.rb 
# foo.rb
class Foo
  def self.print
    @@stdin = STDIN.tty? ? nil : $stdin.read #ok for cli pipe-in
    puts "stdin: #{@@stdin}"
  end
end

$ echo "piped" | ruby test.rb 
stdin: bar