在Ruby中需要另一个文件时停止执行代码

时间:2016-02-12 05:49:58

标签: ruby require execution

我有一个文件foo.rb,其中包含以下内容:

class Foo
    def do_stuff
        puts "Doing stuff"
    end

    def do_other_stuff
        puts "Doing other stuff"
    end
end

f = Foo.new
f.do_stuff

我希望在另一个文件bar.rb中使用此文件并访问Foo类中的方法,而不执行foo.rb中的说明。 期待输出:

Doing other stuff

我在bar.rb中尝试了以下内容:

require 'foo'

f = Foo.new
f.do_other_stuff

但是,要求文件执行foo.rb的代码,我的输出是这样的:

Doing stuff
Doing other stuff

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:2)

要求文件将执行代码。我认为这是一个糟糕的设计,你想要实现的目标。但是,您仍然可以通过将代码放在if __FILE__ == $0块:

中来规避它
if __FILE__ == $0
 f = Foo.new
 f.do_stuff
end

if __FILE__ == $0将确保块内的代码仅在直接运行时执行,而不是在需要时执行,如示例所示。

答案 1 :(得分:1)

如果您只想阻止输出,请执行以下操作:

stdout_old = $stdout.dup
stderr_old = $stderr.dup
$stderr.reopen(IO::NULL)
$stdout.reopen(IO::NULL)
require "foo"
$stdout.flush
$stderr.flush
$stdout.reopen(stdout_old)
$stderr.reopen(stderr_old)

答案 2 :(得分:0)

  

我想要在另一个文件bar.rb中使用此文件并访问Foo类中的方法,而不执行foo.rb中的说明。

由于执行Foo中的指令,foo.rb类中的方法是定义的 ,这显然是非感性且不可能的:要么Foo },然后你必须执行说明,或者你没有执行说明,但是你没有得到Foo