似乎 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, 其所定义的方法可以直接使用

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

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 进行关闭,记住默认是打开的。

这是一种略显怪异的语法,相当于是块外处理,断言未成功抛出的异常类型是 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 断言可以放在方法体外了,用来断言最终的结果

链接:

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

  1. python自定义函数判断一个数是否大于0_python定义函数以及参数检查

    在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...

  2. Linux系统与网络、磁盘参数和日志监控等命令详解二

    创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...

  3. Linux 下几款程序内存泄漏检查工具

    Linux 下几款程序内存泄漏检查工具 chenyoubing | 发布于 2016-07-23 10:08:09 | 阅读量 93 | 无 写这篇博客的原因呢是因为自己在编写基于Nginx磁盘缓存管 ...

  4. Linux设备树语法详解【转】

    转自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备 ...

  5. Java可变参数 Python可变参数 Scala可变参数

    Java 可变参数的特点: (1).只能出现在参数列表的最后: (2)....位于变量类型和变量名之间,前后有无空格都可以: (3).调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体 ...

  6. linux spidev 应用_嵌入式Linux设备树语法总结

    1 设备树的说明 在写完嵌入式驱动总结后,对于设备树相关的语法和使用一直都想进行系统的描述,但是因为最近比较忙碌,所以一直拖到现在才完成初版,对于整个嵌入式Linux驱动开发中,设备树语法和构建是其中 ...

  7. py获取前端的参数_Python小工具系列(3)之参数检查

    #Python小工具系列# python 这是Python小工具系列第三篇,以往分别有 1.Python小工具系列(1)之file_cache 2.Python小工具系列(2)之Test_all 这次 ...

  8. Linux下Shell脚本命令行参数:getopt、getopts用法

    目录 简介 getopt 简介 支持选项 用法 getopt optstring parameters getopt [options] [--] getopt [options] -o|--opti ...

  9. 占位符语法-Scala

    介绍 占位符语法使Scala更简洁,Scala使用下划线作为占位符,但是每个参数在方法体中仅仅能够出现一次.多个占位符表示是多个参数,并不会重复使用相同的参数.占位符语法不支持参数重用性. 例子1 s ...

最新文章

  1. 人工智能的炒作_解密人工智能:是炒作还是我们期望太高
  2. A good debug parameter - sap-ds-debug=true
  3. [yii2] 实现所有action方法之前执行一段代码或者方法
  4. swift5以上版本的代理的实现,详细教你书写代理
  5. (王道408考研操作系统)第三章内存管理-第二节4:页面分配策略
  6. 机械师开机黑屏自动修复此计算机,机械师F117-V-BISO还原教程
  7. 使用Entity Developer构建ASP.NET Core Web API应用程序
  8. 深度:芸芸众司向AI进军路上的笑与泪
  9. 如何自定义一个注解(@Annotation)
  10. wordpress建立二级导航菜单
  11. Windows 8 开发者预览版下载及简体中文语言包下载
  12. niceScroll滚动条使用
  13. 浅谈《软件工程》常用的几种软件开发方法
  14. zabbix监控华为USG6000防火墙
  15. C语言递归函数求n!的两种写法---详细讲解
  16. 动态监听监听和静态注册---elaine
  17. MySQL优化和集群
  18. 2022年,送给程序员的运动健身知识
  19. vue中nextTick使用引起的一个小问题
  20. 炫酷!200 行 Python 代码实现马赛克拼图!

热门文章

  1. 百度html5.3,移动版百度首页推HTML5+CSS3特效 情人节演绎技术范
  2. 数据可视化--饼状图
  3. BZOJ 1499 NOI2005 瑰丽的华尔兹
  4. javaScript内置函数(内置函数,内置关键字)
  5. 论文翻译:Recent Iris and Ocular Recognition Methods in High- and Low-Resolution Images A Survey
  6. 使用wangEditor富文本编辑器上传图片和文字
  7. 固定资产设备管理系统
  8. 欧陆战争5设备系统时间与服务器时间不一致,欧陆战争5怎么领每日任务 每日任务数量与质量攻略...
  9. Internet of Things:物联网的应用领域涉及到方方面面,在工业、农业、环境、交通
  10. 全网最全的微服务链路追踪实践-SkyWalking(看这一篇就够了)