ScalaTest语法如何工作?
我在
Scala中做了一些编程,我知道,例如,
xs map f 是一样的 xs.map(f) 但我不知道如何将这种语法概括为像ScalaTest的语法, it should "throw NoSuchElementException if an empty stack is popped" in { val emptyStack = new Stack[String] evaluating { emptyStack.pop() } should produce [NoSuchElementException] } 我主要想知道看起来像多字构造的东西,即应该产生的东西.它很整洁. 解决方法
这种语法是运算符表示法中的方法调用,但不仅仅是三个令牌.正如你已经提到的:
xs map f 手段: xs.map(f) 但你可以进一步说: xs map f map g 意思是: xs.map(f).map(g) 例如,在ScalaTest匹配器中,您可以说: result should not be null 这会被编译器贬低为: result.should(not).be(null) 这个: it should "throw an exception" in { ... } 变得卑鄙: it.should("throw an exception").in { ... } 最后的花括号实际上只是将花括号(测试代码)之间的代码传递给in方法的一种方法,包装为无参数函数.所以这些都是同一个想法.运算符表示法连续使用两次. 你问过的最后一个有点不同: evaluating { ... } should produce [IllegalArgumentException] 这变成了: 评估{…}首先是评估,因为花括号给它优先.这是一个方法调用,您正在调用一个名为“evaluate”的方法,将花括号之间的代码作为无参数函数传递.返回一个应该调用的对象.所以应该是通过调用求值返回的对象的方法.实际需要的是调用产品的结果.这里的produce实际上是一个方法,它有一个类型参数,如[IllegalArgumentException].它必须以这种方式完成,因此Scala编译器可以“穷人 – 实现”该类型参数.它将隐式“Manifest”参数传递给可以为IllegalArgumentException提供java.lang.Class实例的产品.因此,当调用方法时,它有一个包含传递给求值的代码的函数,以及一种查找放在方括号中的异常类型的java.lang.Class的方法.因此它执行try中包含的代码块,捕获异常,将其与预期进行比较.如果没有抛出异常或错误的异常,则should方法抛出TestFailedException.否则,should方法只是静默返回. 所以,答案就是这条线被玷污了: (evaluating { ... }).should(produce[IllegalArgumentException] (compilerSuppliedManifest)) 故事的寓意是,像这样的高级代码使得更容易看到程序员的意图,但往往更难理解代码的实际工作方式.在实践中大部分时间你所关心的只是意图,但是你需要知道某些东西是如何工作的.在Scala中的这种情况下,您可以将-Xprint:typer作为命令行arg传递给Scala编译器,它将在所有desugaring发生后打印出您的文件版本.所以你可以在需要时看到什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Angular练习之animations动画二
- twitter-bootstrap – twitter bootstrap popover不适用于a
- (总结1)WinForm中文件上传服务器:WebService
- angular – 是否有DOM nativeElement的typescript定义?
- 如何在bash中更改argv0 so命令在ps中显示不同的名称?
- 循环 – ng中的angular2切换图标
- AngularJS学习之旅—AngularJS 控制器(六)
- CXF开发WebService客户端
- ofbiz的webservice接口提供(2)-数据类型的局限性
- 使用Scala 2.11反射时“涉及对象InterfaceAudience的非法循