2016-11-05 60 views
0

Eiffel有一個功能Design by Contract。據此,對於任何例行公事,都有一個檢查,例如requireensure這些斷言必須爲真。但是,我一直無法找到如何通過命令行強制執行規則,如果斷言爲false,則編譯器或運行時必須有錯誤/異常。如何通過命令行強制執行埃菲爾的斷言?

例如,如果這是根類,

class 
    APPLICATION 

inherit 
    ARGUMENTS 

create 
    make 

feature {NONE} 


    object: TEST1 
    make 
      -- Run application. 
     do   
      create object 
      object.function(-1) 
      print(object.value) 
     end 
end 

,這是TEST1

class 
    TEST1 

feature 

    value: INTEGER 
      -- value for testing 
    function(val: INTEGER) 
      -- Assign 
     require 
      val>0 
     do 
      value:=val 
     ensure 
      value>0  
     end 

end 

程序編譯和執行而沒有任何錯誤,即使兩者的斷言被違反。

我使用

ec application.e

但是,編譯,艾菲爾工作室確實發現有違反合同的。

那麼,如何通過命令行執行此操作?有沒有特殊的標誌可供使用?

回答

1

看起來EiffelStudio的GUI版本和EiffelStudio的命令行版本在創建新項目時使用不同的默認值:命令行版本關閉斷言監視並且GUI版本打開斷言監視。事實上,您可以在GUI中打開使用命令行版本創建的項目,或者相反,可以使用命令行編譯器編譯由GUI版本創建的項目。項目設置保存在.ecf文件中並且是項目的一部分,即該.ecf文件應與項目一起分發。

爲了解決你所描述的具體問題,打開GUI的.ecf文件|打開工程|添加項目|打開),然後導航到工程|項目設置|聲明,打開所有聲明並按保存,退出GUI版本。現在,當您從命令行重新編譯項目時,斷言將會打開,並且您將在執行期間按預期得到異常跟蹤。

+0

這不適合我。該設置顯示所有斷言都設置爲true,但即使在使用bash運行它時斷言被違反,程序仍會通過。 – GoodDeeds

+0

@GoodDeeds,你會嘗試刪除'EIFGENs'目錄,保存項目頂部的'application.ecf'並重新編譯? –