scala工具集

scala 隐式转换- 写出你的笔记

2019-05-08  本文已影响0人  小赵营

欢迎转载 请注明出处

蚁人穿越到蜘蛛侠

scala隐式类型对精简代码和提升可读性上有很大的帮助,一直是解零零碎碎学习,从没有系统梳理过。从时间线上看,我们理解知识的路线并不是从入门到精通,更多的是是从入门到迷糊\放弃。
现在记录使用时的方方面面。不难哦,因为不涉及理论和编译层面的内容。

scala的类型推导系统很强大,引入隐式类型在精简上简直是如虎添翼。对我们阅读者而言,隐式类型提升程序扩展性和灵活性同时,也引发可读性的另一个争论-代码可读性问题。 在这里,我们不辩争议,只述说功能。

内容提要

本文内容述说隐式类型的用途,以及使用时的约束。
每一种隐式类型从使用方法完整类型签名例子使用中的约束进行说明。

基本隐式类型解析(编译器是如何查找到缺失信息解析)规则如下:
1.首先会在当前代码作用域下查找隐式实体(隐式方法 隐式类 隐式对象)
2.如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找

详细的解析方式可参考 官方隐式类型推导QA

隐私类型声明

scala中隐式类型定义关键字 implicit.在隐式类型前使用 implicit即可。以隐式类为例:

object Helpers {
    implicit class IntWithTimes(x: Int) {
        def times[A](f: => A): Unit = { }
    } 
}

上例中 IntWithTimes是一个隐式类.使用隐式类,导入 Helpers对象,我们调用times时,不再需要new IntWithTimes .那么,implicit 关键字可作用于哪些类型?又如何使用哪?下面一一说明。

隐式类型使用规则
隐式类型方法列表
隐式类型方法之:隐式函数转换 (implicit conversion)

​ 隐式函数转换是提供一个从类型ST的转换即 S=>T

隐式类型方法之:隐式值 implicit val/var

隐式参数转换和隐式值使用时,要定义内类/trait/object等类型内。

隐式类型方法之: 隐式类implict class
隐式类型方法之:隐式参数 implicit parameters
隐式类型方法之:隐式对象 implicit object
隐式类型方法之:隐式宏 implict macro

隐式宏类型2.10.0版本发布的实验功能,该功能不在本文说明范围内。感兴趣的童鞋,参见官方隐式宏介绍

在泛型中,隐式类型应用有稍许差异,如T<% X协变除包含T``X的包含关系外,还支持隐式类型的转换。

总结

以上,着重介绍了隐式类型功能,对各类型的如何声明/使用,以及约束都有描述。理解本文满足解决普通隐式类型如何使用问题。随着对隐式类型的使用,我们的理解也会越来越深入。

最后,本文虽然不是一篇隐式类型从入门到精通文章,至少是一篇深入浅出的问题吧。

坊间传闻,点赞有人爱▄█▀█给跪了

* 参考文档列表 *

https://docs.scala-lang.org/tour/implicit-parameters.html#inner-main
https://docs.scala-lang.org/zh-cn/overviews/core/implicit-classes.html
https://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html

上一篇 下一篇

猜你喜欢

热点阅读