2 days ago 可以是一行代码,如同java里(int i=0;)可以通过编译,太Cool了,如同一句日常用语,非常吸引人;这行代码是在《Programming Scala:multi...》7.5节"隐式类型转换"里看到的,书里ago好像用的是String类型的,缺乏美观,虽是本入门级的书,不过入门级却不一定是写的很薄,可以做一些全面的介绍而不求讲的很深入;
于是自己就改编了一下:
import java.text.SimpleDateFormat
import java.util.{Calendar,Date}
sealed abstract class Day
abstract class Forward extends Day
abstract class Backward extends Day
case object ago extends Backward
case object before extends Backward
case object after extends Forward
case object later extends Forward
class DSL(x:Int){
def days(day:Day)={
var can=Calendar.getInstance
def backward():Unit=can.set(Calendar.DAY_OF_MONTH, can.get(Calendar.DAY_OF_MONTH)-x)
def forward():Unit=can.set(Calendar.DAY_OF_MONTH, can.get(Calendar.DAY_OF_MONTH)+x)
day match{
case day:Backward => backward()
case day:Forward => forward()
case _ =>
}
DSL.formats(can.getTime)
}
}
object DSL{
implicit def intToDSL(x:Int)=DSL(x)
def apply(x:Int)=new DSL(x)
def formats(date:Date)=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date)
def now=formats(Calendar.getInstance.getTime)+" => now..."
def main(args:Array[String]):Unit={
println(now)
println(2 days ago)
println(3 days before)
println(3 days after)
println(4 days later)
}
}
环境2.8.1.final,另存为xxx.scala文件
编译>scala xxx.scala
运行>scala DSL
2010-12-12 17:57:04 => now...
2010-12-10 17:57:04
2010-12-09 17:57:04
2010-12-15 17:57:04
2010-12-16 17:57:04
用String做匹配当然可以,我感觉应该用Scala的本身特性来做介绍,这样更能吸引读者;
case class 用在模式匹配,可以用来构建(复杂)表达式;
case object 在actor模型里被当做消息用于模式匹配,当然还有别的功能;
这个例子涉及到的知识点有:包引用,密封类,case object,隐式转换,模式匹配,函数,apply方法;
开始我是用case class,有点冗余,这里只是当做消息处理,于是改成case object;
解释一下,运行2 days ago这行代码,2是整型对象,它没有days方法,就会在执行的上下文里找一个隐式函数,这个隐式函数可以把整型对象转换成带有days方法的目标对象,如果预导入的PreDef对象内也含有一个做到上述功能的隐式函数,那么编译器会认为这是冲突,无法编译:
Note that implicit conversions are not applicable because they are ambiguous
这里我认为,编译器应该优先去找用户自定义隐式函数,而不是报错,呵呵,那样的话编译器要做更多的工作了。
分享到:
相关推荐
Scala:Applied Machine Learning by Pascal Bugnion English | 23 Feb. 2017 | ISBN-13: 9781787126640 | 1843 Pages | EPUB/PDF (conv) | 33.15 MB Leverage the power of Scala and master the art of building, ...
"Scala: Guide for Data Science Professionals (Learning Path)" ASIN: B06XCJVY21, eISBN: 1787282856 | 2017 | True PDF | 1100 pages | 15 MB Scala will be a valuable tool to have on hand during your data...
glicko2-scala Scala中实现的Glicko2排名系统
plotly-scala是一个Scala库,能够输出可以传递给的JSON。 它的类严格遵循plotly.js的API,因此可以通过跟随plotly.js的使用来使用plotly-scala。 这些类可以转换为JSON,可以直接提供给plotly.js。 可以在scala-js或...
本书是Scala编程语言的权威教程,由该语言的设计师Martin Odersky共同编写。
scala:scala代码
广告流量实时统计(Scala)
Programming.Scala_Tackle.Multi-Core.Complexity.on.the.Java.Virtual.Machine[2009][EN][PDF] Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine by Venkat Subramaniam Scala is ...
CrossCuttingConcern_Scala 在 Scala 中使用面向切面编程 (AOP) 实现横切关注
Testcontainers-scala 用于Scala包装器,允许使用容器进行功能/集成/ 单元测试。 TestContainers是一个Java 8库,支持JUnit测试,它提供了常见的数据库,Selenium Web浏览器或其他可以在Docker容器中运行的轻量,一...
ddd-on-scala:Scala的DDD示例实现
aws-dynamodb-scala:Amazon DynamoDB的Scala客户端
赠送jar包:scala-parser-combinators_2.11-1.0.4.jar; 赠送原API文档:scala-parser-combinators_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-parser-combinators_2.11-1.0.4-sources.jar; 包含翻译后的API...
js-scala:JavaScript作为Scala中的嵌入式DSL js-scala是一个Scala库,提供可组合JavaScript代码生成器作为嵌入式DSL。 从类似于Scala的代码生成(优化)JavaScript代码: import scala . js . language . JS ...
prometheus_client_scala:用于Prometheus监控的Scala客户端
template.scala:Scala中的C ++风味模板元编程
赠送jar包:scala-xml_2.11-1.0.4.jar; 赠送原API文档:scala-xml_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-xml_2.11-1.0.4-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.11-1.0.4.pom; 包含翻译后的API...
Docker-Scala 概括 Docker Hub 中的仓库名称: 该存储库包含 Dockerized 和 ,通过自动构建机制发布到公共 。 配置 此 docker 映像包含以下软件堆栈: 操作系统:Debian 8(“杰西”)。 Java:Oracle JDK 1.7.0...
第2讲-课程介绍、特色与价值 共13页 第3讲-Scala编程详解:基础语法 共8页 第4讲-Scala编程详解:条件控制与循环 共7页 第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共...
第2讲-课程介绍、特色与价值 共13页 第3讲-Scala编程详解:基础语法 共8页 第4讲-Scala编程详解:条件控制与循环 共7页 第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共...