文档章节

Scala Implicit Parameters

秋风醉了
 秋风醉了
发布于 2015/04/28 17:34
字数 600
阅读 74
收藏 0
点赞 0
评论 0

Scala Implicit Parameters

如果定义函数时,标明某一参数为implicit,则这个参数是隐式参数。看起来与缺省参数(Default Parameters)类似,调用者不必在调用时指定该参数。

但是就实际运行机制而言,隐式参数与缺省参数是完全不一样的。缺省参数是函数定义方设定了一个缺省值,在调用者没有指明时将使用该缺省值。 隐式参数则不同,最终是会由调用方指定参数值,只是不一定在调用的语句里指定而已。编译器在发现缺少隐式参数时,会在程序范围内寻找符合类型的隐式值,如果找不到则编译会失败。

如下代码,

abstract class Logger {
  def log(s: String)
}

class FileLogger extends Logger {
  def log(s: String) {
    println("Log in file: " + s)
  }
}

class StdoutLogger extends Logger {
  def log(s: String) {
    println("Stdout: " + s)
  }
}

def Add(a: Int, b: Int)(implicit logger: Logger) {
  val sum = a + b
  logger.log("%d + %d = %d".format(a, b, sum))
}

implicit val log = new FileLogger

Add(1, 2)
Add(2, 3)(new StdoutLogger) //you may do it explicitly

运行并输出,

C:\WorkSpace6-scala\scala-train\src\com\usoft>scala implicit_parameter.scala

Log in file: 1 + 2 = 3

Stdout: 2 + 3 = 5

如果上述代码没有implicit val log = new FileLogger这一句,在代码范围内也没有其他的Logger类型的implicit值,编译器会报错:

could not find implicit value for parameter logger: com.scalass.examples.blog.ImplicitParameters.Logger

反之,如果能找到Logger类型的隐式值,编译器会将该隐式值作为参数传递过去。

与隐式转换一样,你也可以选择显示的传递隐式参数,实际上编译器就是这样做的,在程序上下文找到符合类型要求的隐式值,将它显示的作为参数传递。 也与隐式转换一样,隐式值的名称对编译器并无影响,只要类型符合即可,但是为了可读性,建议赋予它合适的名称。

到这里可能你会有些想法了,其实同样的功能可能可以由依赖注入等方式实现。在使用依赖注入,或是继承等方式能实现的情况下,我们不建议使用隐式转换或隐式参数。 因为其他的方式,代码结构可能会更清晰,而过多的使用隐式转换或隐式参数常常会让读者摸不着头脑。

============END============

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 222
博文 581
码字总数 411013
作品 0
东城
程序员
IntelliJ Scala Plugin 1.3 EAP 1.2.67 发布

IntelliJ Scala Plugin 1.3 EAP 1.2.67 发布,此版本现已提供下载:http://download.jetbrains.com/scala/scala-intellij-bin-1.2.67.1.EAP.zip,包括大量改进: Moncole 支持 Unused impor......

oschina ⋅ 2015/01/20 ⋅ 1

Scala 的下一代编译器--Dotty

Dotty 是 Scala 的下一代编译器,也是 Scala 的新语言概念和编译器技术研究平台。 具有以下特性: Union, intersection and literal singleton types Implemented Trait parameters Impleme...

匿名 ⋅ 2017/06/02 ⋅ 3

Scala Plugin 1.3 for IntelliJ IDEA 14.0.3 发布

Scala Plugin 1.3 for IntelliJ IDEA 14.0.3 发布,此版本更新内容如下: 调试器改进 Мariables from the outer scopes are visible in the Variables tab now: there is no need to evalua......

oschina ⋅ 2015/01/30 ⋅ 1

Spray参数转化

最近用spray做点东西,刚开始入门,把doc大概过了一遍,最灵活的要数它的routing-DSL了。当然由于scala强大的特性,很多不同于Java的东西,源码看起来还是相当费劲的,尤其是对于我这种scala...

谦谦君子 ⋅ 2014/09/19 ⋅ 0

Scala implicit implicit基本含义

Scala implicit implicit基本含义 在Scala中有一个关键字是implicit, 之前一直不知道这个货是干什么的,今天整理了一下。 我们先来看一个例子: def display(input:String):Unit = println...

泳泳啊泳泳 ⋅ 01/07 ⋅ 0

Scala学习笔记(4):关于String

Scala并没有定义自己的String类型,而是直接借用了Java中的String,所以如果你定义一个String类型的值: val str = "hello" 返回的值的类型直接就是java.lang.String。然而,我们知道在Scala...

chengyao2 ⋅ 2013/05/14 ⋅ 0

scala 果然是一门非常有创造力的语言

Scala作为JVM上的新语言,借鉴了OO和FP的很多思想,推荐各位有时间可以看看。FP的很多思想对于习惯了OO的人来说简直是一种冲击。 我特别喜欢Scala无处不在的Pattern Match,以及implicit的概...

xiaowenliang ⋅ 2010/12/10 ⋅ 8

Spark算子:RDD行动Action操作(2)–take、top、takeOrdered

take def take(num: Int): Array[T] take用于获取RDD中从0到num-1下标的元素,不排序。 scala> var rdd1 = sc.makeRDD(Seq(10, 4, 2, 12, 3)) rdd1: org.apache.spark.rdd.RDD[Int] = Paral......

chensanti234 ⋅ 2016/12/20 ⋅ 0

Scala的级别:初学者到专家,程序员到类库设计者

Created by odersky on 2011-01-16. Updated: 2011-01-16, 17:35 Scala有一些善变和灵活。它令许多编程任务变得简单,但是同时它还包含了一些复杂的结构以便专家来设计真正高级的,类型安全的...

崔钢 ⋅ 2011/02/20 ⋅ 2

Scala类型系统——高级类类型(higher-kinded types)

高级类类型就是使用其他类型构造成为一个新的类型,因此也称为 类型构造器(type constructors)。它的语法和高阶函数(higher-order functions)相似,高阶函数就是将其它函数作为参数的函数;高...

Barudisshu ⋅ 2016/06/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长...

颖辉小居 ⋅ 17分钟前 ⋅ 0

利用有限制通配符提升API灵活性(28)

1、参数化类型是不可变的 List<String> 不是List<Object>的子类,但是二者是有联系的 利用有限制的通配符类型处理类似情况 List<? extends Object>(生产者) Collection<? super E>(消费者......

职业搬砖20年 ⋅ 23分钟前 ⋅ 0

ssm框架 +bootstrap分页

这里有两种方式 方式一:自己写分页 方式二:使用插件PageHelper 1.自己写分页 1.1 效果 1.2 实现过程 1.2.1 创建分页公共类 //---------------------------1.属性-------------------------...

Lucky_Me ⋅ 30分钟前 ⋅ 0

Istio

helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/istio.yaml after $ kubectl create namespace istio-system$ kubectl create -f $HOME/ist......

openthings ⋅ 30分钟前 ⋅ 0

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 36分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 36分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 40分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 53分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 58分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部