Scala Implicit Parameters

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============

转载于:https://my.oschina.net/xinxingegeya/blog/407339

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值