北冥有鱼


  • 首页

  • 分类

  • 归档

  • 标签

  • 搜索

scala 隐式转换

发表于 2017-03-15 | 分类于 scala , scala 隐式转换 |

隐式转换执行过程分析

概念

Java 有很庞大的类库资源,但是 被声明成 final 的类不允许继承 例如 String , 怎样扩展java及第三方类库 Scala提供了很灵活的方式

当 scala 使用 implicit 隐式转化时 , scala 编辑器发现对象的类型不匹配时,不会直接报错,而会在代码中尝试匹配implicit声明的object, 当然,相同方法签名的类必须唯一。
举个小例子,实现在字符串前后 添加 “**” 的操作。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.File
import scala.io.Source
/**
* 隐式转换
*/
class RichFile(val file:File){
def read() = Source.fromFile(file.getPath()).mkString
}
object Context{
implicit def file2RichFile(file:File) = new RichFile(file)
}
object hello_implicit_convertion{
def main(args: Array[String]) {
import Context.file2RichFile
println( new File("I:\\aa.txt").read())
}
}

代码的执行过程如下:

  1. 调用File 的read 方法
  2. 当编译器发现File类没有read 方法时,不是直接报错,而是执行第三步
  3. 检查当前作用域中是否有接受File的 implicit 方法,如没有直接报错,如有,执行第4步
  4. 将File作为参数实例化RichFile,再检查是否有read 方法,如没有直接报错
  5. 执行read方法

整个执行过程中,需要特别注意的是, 作用域

阅读全文 »

scala 集合操作

发表于 2017-03-15 | 分类于 scala , scala 集合 |

常用操作符

  • ++ ++[B](that: GenTraversableOnce[B]): List[B] 从列表的尾部添加另外一个列表
  • ++: ++:[B >: A, That](that: collection.Traversable[B])(implicit bf: CanBuildFrom[List[A], B, That]): That 在列表的头部添加一个列表
  • +: +:(elem: A): List[A] 在列表的头部添加一个元素
  • :+ :+(elem: A): List[A] 在列表的尾部添加一个元素
  • :: ::(x: A): List[A] 在列表的头部添加一个元素
  • ::: :::(prefix: List[A]): List[A] 在列表的头部添加另外一个列表
  • :\ :[B](z: B)(op: (A, B) ⇒ B): B 与foldRight等价
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
val left = List(1,2,3)
val right = List(4,5,6)
//以下操作等价
left ++ right // List(1,2,3,4,5,6)
left ++: right // List(1,2,3,4,5,6)
right.++:(left) // List(1,2,3,4,5,6)
right.:::(left) // List(1,2,3,4,5,6)
//以下操作等价
0 +: left //List(0,1,2,3)
left.+:(0) //List(0,1,2,3)
//以下操作等价
left :+ 4 //List(1,2,3,4)
left.:+(4) //List(1,2,3,4)
//以下操作等价
0 :: left //List(0,1,2,3)
left.::(0) //List(0,1,2,3)

看到这里大家应该跟我一样有一点晕吧,怎么这么多奇怪的操作符,这里给大家一个提示,任何以冒号结果的操作符,都是右绑定的,即 0 :: List(1,2,3) = List(1,2,3).::(0) = List(0,1,2,3) 从这里可以看出操作 :: 其实是右边 List 的操作符,而非左边 Int 类型的操作符

阅读全文 »

scala 模式匹配

发表于 2017-03-14 | 分类于 scala , 模式匹配 |

概念

scala 中的模式并不是指设计模式,它是数据结构上的模式,是用于描述一个结构的组成。

阅读全文 »

Spring MVC

发表于 2017-03-02 | 分类于 Spring MVC , 笔记 |

控制器(controller)

控制器作为应用程序逻辑的处理入口,它会负责去调用你已经实现的一些服务。通常,一个控制器会接收并解析用户的请求,然后把它转换成一个模型交给视图,由视图渲染出页面最终呈现给用户。Spring对控制器的定义非常宽松,这意味着你在实现控制器时非常自由。

阅读全文 »

scala 类型系统

发表于 2017-03-02 | 分类于 scala , 类型系统 |

upper bounds

上界

  • 标识: <:
1
2
3
def pr(list : List[_ <: Any]) {
list.foreach(print)
}
阅读全文 »
12…17
IAN

IAN

啊~ 五环

85 日志
21 分类
18 标签
GitHub Twitter 微博
© 2016 - 2017 IAN
由 Hexo 强力驱动
主题 - NexT.Mist
本站访问数人次 本站访问总量次