2016-11-05 50 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'并重新编译? –