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, 其所定义的方法可以直接使用
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相关推荐
- python自定义函数判断一个数是否大于0_python定义函数以及参数检查
在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...
- Linux系统与网络、磁盘参数和日志监控等命令详解二
创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...
- Linux 下几款程序内存泄漏检查工具
Linux 下几款程序内存泄漏检查工具 chenyoubing | 发布于 2016-07-23 10:08:09 | 阅读量 93 | 无 写这篇博客的原因呢是因为自己在编写基于Nginx磁盘缓存管 ...
- Linux设备树语法详解【转】
转自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备 ...
- Java可变参数 Python可变参数 Scala可变参数
Java 可变参数的特点: (1).只能出现在参数列表的最后: (2)....位于变量类型和变量名之间,前后有无空格都可以: (3).调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体 ...
- linux spidev 应用_嵌入式Linux设备树语法总结
1 设备树的说明 在写完嵌入式驱动总结后,对于设备树相关的语法和使用一直都想进行系统的描述,但是因为最近比较忙碌,所以一直拖到现在才完成初版,对于整个嵌入式Linux驱动开发中,设备树语法和构建是其中 ...
- py获取前端的参数_Python小工具系列(3)之参数检查
#Python小工具系列# python 这是Python小工具系列第三篇,以往分别有 1.Python小工具系列(1)之file_cache 2.Python小工具系列(2)之Test_all 这次 ...
- Linux下Shell脚本命令行参数:getopt、getopts用法
目录 简介 getopt 简介 支持选项 用法 getopt optstring parameters getopt [options] [--] getopt [options] -o|--opti ...
- 占位符语法-Scala
介绍 占位符语法使Scala更简洁,Scala使用下划线作为占位符,但是每个参数在方法体中仅仅能够出现一次.多个占位符表示是多个参数,并不会重复使用相同的参数.占位符语法不支持参数重用性. 例子1 s ...
最新文章
- 人工智能的炒作_解密人工智能:是炒作还是我们期望太高
- A good debug parameter - sap-ds-debug=true
- [yii2] 实现所有action方法之前执行一段代码或者方法
- swift5以上版本的代理的实现,详细教你书写代理
- (王道408考研操作系统)第三章内存管理-第二节4:页面分配策略
- 机械师开机黑屏自动修复此计算机,机械师F117-V-BISO还原教程
- 使用Entity Developer构建ASP.NET Core Web API应用程序
- 深度:芸芸众司向AI进军路上的笑与泪
- 如何自定义一个注解(@Annotation)
- wordpress建立二级导航菜单
- Windows 8 开发者预览版下载及简体中文语言包下载
- niceScroll滚动条使用
- 浅谈《软件工程》常用的几种软件开发方法
- zabbix监控华为USG6000防火墙
- C语言递归函数求n!的两种写法---详细讲解
- 动态监听监听和静态注册---elaine
- MySQL优化和集群
- 2022年,送给程序员的运动健身知识
- vue中nextTick使用引起的一个小问题
- 炫酷!200 行 Python 代码实现马赛克拼图!
热门文章
- 百度html5.3,移动版百度首页推HTML5+CSS3特效 情人节演绎技术范
- 数据可视化--饼状图
- BZOJ 1499 NOI2005 瑰丽的华尔兹
- javaScript内置函数(内置函数,内置关键字)
- 论文翻译:Recent Iris and Ocular Recognition Methods in High- and Low-Resolution Images A Survey
- 使用wangEditor富文本编辑器上传图片和文字
- 固定资产设备管理系统
- 欧陆战争5设备系统时间与服务器时间不一致,欧陆战争5怎么领每日任务 每日任务数量与质量攻略...
- Internet of Things:物联网的应用领域涉及到方方面面,在工业、农业、环境、交通
- 全网最全的微服务链路追踪实践-SkyWalking(看这一篇就够了)