2013-02-11 67 views
1

我想在Ruby中編寫一個腳本,它交互地爲程序生成一些輸入數據。當它存在時,這個想法是使用QtRuby,否則使用控制檯。我試過的是如何讓Ruby部分解析源代碼?

begin 
    require "Qt4" 
rescue LoadError => load_err 
    puts "Qt not found, using console" 
end 

class ConsoleDefine 
    # console code 
end 

class QtDefine < Qt::Widget 
    # GUI code 
end 

但是當Qt4不存在時,解釋器拒絕了我的代碼。有沒有辦法對付它類似於C++,如:

#ifdef QT4 
class qt4gui 
{ 
    // some code 
}; 
#else 
class qt4gui 
{ 
    // dummy 
}; 
#endif // Qt4 
+1

源文件只是源文件;你是否嘗試將它包裝在試圖從有問題的軟件包中評估某些東西的東西中? – 2013-02-11 19:11:19

+1

Ruby中的''class'關鍵字*僅僅是一個表達式*(它不同於Java/C#這樣的語言,它是一個聲明)。因此,它們可以嵌套在其他語句/表達式中:'如果已定義? Qt的; class QtDefine 2013-02-11 19:12:10

回答

4

使用需要你的優勢:

begin 
    require "Qt4" 
    require "my_lib/qt4" 
rescue LoadError => load_err 
    puts "Qt not found, using console" 
    require "my_lib/console" 
end 

創建兩個文件:

# my_lib/console.rb 
class ConsoleDefine 
    # console code 
end 

# my_lib/qt4.rb 
class QtDefine < Qt::Widget 
    # GUI code 
end 
+0

哦,是的,這正是我需要的。非常感謝提示! – xis 2013-02-11 19:15:52

1

正如@pst說,你不需要Ruby中的預處理器,因爲它是動態的。所以:

begin 
    require "Qt4" 
    class QtDefine < Qt::Widget 
    # GUI code 
    end 
rescue LoadError => load_err 
    puts "Qt not found, using console" 
    class ConsoleDefine 
    # console code 
    end 
end 
+1

這是我的第一個想法,但現在你的主文件中有兩個不同的系統,在一些幾乎不可見的「救援」中混亂。 – Reactormonk 2013-02-11 19:28:49

+0

@xis19想要什麼。在C預處理器中,文件看起來是一樣的。 – Necto 2013-02-11 19:31:16