linux识别require语法,Scala 的参数检查与断言: require, assert, assume 和 ensuring

似乎 C/C++ 的编程人员相比于 Java 更偏爱于断言,JDK 1.4 才开始引入 assert 的支持,但默认是关闭的,需要用 -ea 编译选项打开,否则代码中的 assert 语句全被忽略,一般会在单元测试中开启该选项。简单回顾一下 JDK 自带的断言,它用两种写法

assert object != null;

assert object != null : "object can't be null";

第一个参数是个 bool 值,断言失败只会笼统的抛出java.lang.AssertionError 异常,并不区分是在检验方法参数还是中间运算结果。严谨来说我们会希望参数检查不通过时抛出 java.lang.IllegalArgumentException; 而中间运算结果的断言不过希望抛出 java.lang.AssertionError, 最好是 java.lang.IllegalStateException。

很多时候我们不会去使用 -ea 编译选项,也就是主动放弃了 JDK 本身的断言功能。介于两个因素(不同的断言错误和默认的断言选项关闭),Scala 为我们提供了更方便的参数检查与断言方法,它们来自于 Predef, 其所定义的方法可以直接使用

1a1f1d959b2264449c37f72b26f176f6.png

require() 方法用在对参数的检验上,不通过则抛出 IllegalArgumentException

ae4e3750b716018e791dcc97c9c7be54.png

assert() 或 assume() 方法在对中间结果或私有方法的参数进行检验,不成功则抛出 AssertionError 异常,至于是用 assert() 或是 assume() 方法,就各取所好了,Scala 给出的原则如下:

This method differs from assert only in the intent expressed: assert contains a predicate which needs to be proven, while assume contains an axiom for a static checker

说的是 assert() 包含一下需证明的条件,assume() 代表的是一个公理性的论断。

下面是一个简单的应用示例:

def foo(who: String): Unit = {

require(who != null, "who can't be null")

val id = findId(who)

assert(id != null)

//or

assume(id != null, "can't find id by: " + who)

}

1

2

3

4

5

6

7

deffoo(who:String):Unit={

require(who!=null,"who can't be null")

valid=findId(who)

assert(id!=null)

//or

assume(id!=null,"can't find id by: "+who)

}

上面可以看出,由于这些方法是定义在 Predef 中的,而 Predef 对象的方法默认是被静态引入了的,所以无需写成 Predef.require() 这样子。

Predef 的 assert, assume 也是可以 scalac 的 -Xdisable-assertions 进行关闭,记住默认是打开的。

93c850e5c68319ea49473bd846b7ee6c.png

这是一种略显怪异的语法,相当于是块外处理,断言未成功抛出的异常类型是 java.lang.AssertionError. 来自于之前的例子

private def widen(w: Int): Element = {

if(w < width){

this

} ensuring(_.width > 10) //这里欲断言返回结果 this,所有两 if 后的花括号不能省略

else {

val left = elem(' ', (w - width)/2, height)

var right = elem(' ', (w - width - left.width, height)

left beside this beside right

} ensuring(w <= _.width) //断言的是上一行 left beside this beside right 结果

} ensuring((w + _.width) > 100) //ensuring 断言可以放在方法体外了,用来断言最终的结果

1

2

3

4

5

6

7

8

9

10

privatedefwiden(w:Int):Element={

if(w<width){

this

}ensuring(_.width>10)//这里欲断言返回结果 this,所有两 if 后的花括号不能省略

else{

valleft=elem(' ',(w-width)/2,height)

varright=elem(' ',(w-width-left.width,height)

leftbesidethisbesideright

}ensuring(w<=_.width)//断言的是上一行 left beside this beside right 结果

}ensuring((w+_.width)>100)//ensuring 断言可以放在方法体外了,用来断言最终的结果

链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值