2016-02-12 45 views
-1

另一個文件時,我有具有以下文件foo.rb停止執行要求在Ruby中

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 

有沒有一種很好的方法來解決這個問題?

+0

當通過執行foo中的指令定義Foo類中的方法時,如何獲得「訪問'Foo'類中的方法而不執行'foo.rb'中的指令'」。 rb'? –

回答

2

需要的文件將執行代碼。我認爲它是一個糟糕的設計,你試圖達到的目標。但是你仍然可以通過將代碼if __FILE__ == $0塊繞過它:

if __FILE__ == $0 
f = Foo.new 
f.do_stuff 
end 

if __FILE__ == $0將在需要的時候而不是直接運行,如在你的例子肯定是隻執行了塊中的代碼。

+0

@ samalamma708您的問題意味着您無法更改'foo.rb',並且您正在通過更改'bar.rb'來尋找解決方案。 – sawa

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) 
+1

有趣,但邊緣。 OP要在不執行foo.rb中的指令的情況下訪問'Foo'「。在你的解決方案中,指令仍然被執行,儘管現在他們沒有留下任何痕跡,並且依靠'do stuff'除了'puts'之外什麼都不做。如果'do_stuff'會把一個人送到火星,他就會在他(或她)的路上。當'do_stuff'可以是任何東西時(假設「foo.rb」不能被改變),你可能會添加一些單詞來解決這個問題。 –

+0

@CarySwoveland我意識到這一點,但鬆了一口氣。你是對的。但是嚴格的說,方法定義也是執行。火星上有單程旅行,很可怕。 – sawa

0

我想需要在另一個文件bar.rb,並獲得在Foo類中的方法這個文件沒有foo.rb執行指令。

由於在Foo類中的方法foo.rb執行指令定義,這顯然是無意義的和不可能的:要麼你想Foo,那麼你必須執行的指令,或者你不請執行說明,但不會得到Foo