`
criss
  • 浏览: 24256 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

scala隐式参数(implicit)

 
阅读更多

 

 

SBinary 和 Scalacheck的一部分库,广泛使用了隐式参数。让人联想起了Haskell(一种函数式编程语言)的编程风格,我真心的希望在Scala中这种编程风格更加广泛。这是一种非常有用的技术。

作为开始如下多重入参(柯里化)的例子:

scala -> def foo(x: Int)(y: Int) = x+y

foo: (x: Int)(y: Int) Int

 

scala -> foo (1) (2)

ret0:Int = 3

scala> foo(1, 2);
:6: error: wrong number of arguments for method foo: (Int)(Int)Int
       foo(1, 2);
       ^

scala> foo(1)
:6: error: missing arguments for method foo in object $iw;
follow this method with `_' if you want to treat it as a partially applied funct
ion
       foo(1)

上面你完全可以用单一函数的入参列表来调用它,但是你必须用不同的语法来调用它(两个挎号)

有一种方式你可以申明最后一个参数为隐式(implicit),不需要显式的传递。语法如下:
scala> def speakImplicitly (implicit greeting : String) = println(greeting)
speakImplicitly: (implicit String)Unit

scala> speakImplicitly("Goodbye world")
Goodbye world

scala> speakImplicitly
:6: error: no implicit argument matching parameter type String was foud.

scala> implicit val hello = "Hello world"
hello: java.lang.String = Hello world

scala> speakImplicitly
Hello world

你可以正常调用,也可以不传参数,系统将从作用域中找到一个被标示为
implicit变量,如果找不到implicit变量,编译的时候将会报错。

隐式变量的查找是强制类型匹配的,下面是一些例子展现:
错误的类型:

 

scala> def speakImplicitly (implicit greeting : String) = println(greeting)
speakImplicitly: (implicit String)Unit

scala> implicit val aUnit = ();
aUnit: Unit = ()

scala> speakImplicitly
:7: error: no implicit argument matching parameter type String was found.
只有String类型的隐式变量才能够匹配。

错误的泛型:
scala> def speakImplicitly (implicit greeting : String) = println(greeting)
speakImplicitly: (implicit String)Unit

scala> implicit val hello : Any = "Hello world"
hello: Any = Hello world

scala> speakImplicitly
:7: error: no implicit argument matching parameter type String was found.
隐式参数匹配必须是静态类型,泛型不能够匹配。

多个相同类型的参数:
scala> def speakImplicitly (implicit greeting : String) = println(greeting)
speakImplicitly: (implicit String)Unit

scala> implicit val foo = "foo";
foo: java.lang.String = foo

scala> implicit val bar = "bar";
bar: java.lang.String = bar

scala> speakImplicitly
:9: error: ambiguous implicit values:
 both value bar in object $iw of type => java.lang.String
 and value foo in object $iw of type => java.lang.String
 match expected type String
系统找到两个隐式参数是相同的类型,将无法识别。

子类可以匹配,
scala> def sayThings (implicit args : List[Any]) = args.foreach(println(_))
sayThings: (implicit List[Any])Unit

scala> implicit val nothingNiceToSay : List[Any] = Nil
nothingNiceToSay: List[Any] = List()

scala> sayThings

scala> implicit val hellos : List[String] = List("Hello world");
hellos: List[String] = List(Hello world)

scala> sayThings
Hello world

String作为Any的子类,所以系统可以匹配到.



 

 

分享到:
评论
1 楼 lord_is_layuping 2013-09-13  
学习了,总结得比较详细哦

相关推荐

    scala 隐式转换与隐式参数的使用方法

    Scala 隐式转换与隐式参数的使用方法 Scala 中的隐式转换与隐式参数是两个非常重要的概念,它们可以帮助开发者编写更加简洁、灵活和可维护的代码。本文将详细介绍 Scala 中隐式转换与隐式参数的使用方法,并通过...

    scala隐式.docx

    在Scala中,我们可以定义带有`implicit`关键字的参数,这些参数被称为隐式参数。当一个函数调用时没有明确地提供这些隐式参数,编译器会在作用域内寻找匹配的隐式值来自动填充。在`ImplicitDemo`对象中,`parameter1...

    Scala 专题教程 - 隐式变换和隐式参数-内含源码以及设计说明书(可以自己运行复现).zip

    在Scala中,隐式变换和隐式参数是两个重要的高级特性,它们极大地提升了代码的简洁性和可读性。本教程将深入探讨这两个概念,并通过源码实例帮助你理解和应用。 **隐式变换(Implicit Conversions)** 隐式变换是...

    Scala - Implicit Conversion.docx

    以下是关于Scala隐式转换的详细说明: 1. **隐式转换定义(implicit def)**: 隐式转换通常通过`implicit def`定义,它看起来像一个函数,但会被编译器自动应用在适当的地方。例如: ```scala object ...

    scala中的隐式类型转换的实现

    隐式参数是指在柯里化函数中采用默认参数时,可以使用implicit提供的隐式参数功能。例如,在定义一个函数时,可以使用implicit关键字来指定默认参数值。隐式参数可以自动填充参数列表,使得函数调用更加灵活。 例如...

    Scala第十四章节1

    在Scala编程语言中,隐式转换和隐式参数是两个强大的特性,它们允许程序员以简洁和优雅的方式扩展已有类的功能。在本章中,我们将深入探讨这两个概念,并通过实例了解如何使用它们。 首先,隐式转换(Implicit ...

    scala高级特性

    隐式转换和隐式参数是 Scala 中两个非常强大的功能,利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。 概念 隐式转换是指那种以 implicit 关键字声明的带有单个参数的...

    1、scala面试题(25问).pdf

    Scala语言中的隐式转换函数是指那种以implicit关键字申明的带有单个参数的函数,这样的函数会被自动应用,将值从一种类型转换为另一种类型。 7. 伴生类和伴生对象 在Scala语言中,单例对象与类同名时,该对象被...

    Scala Cookbook

    - **隐式转换**:通过`implicit`关键字,可以创建隐式转换,使类型之间的转换更加方便。 - **类型参数**:泛型让代码更具通用性,可以应用于各种数据类型。 ### 6. 并发与Actor模型 - **Actor**:Scala的Akka库...

    Scala-2.8.1-API.chm.7z

    3. **Implicit Conversions**:隐式转换允许在适当的时候自动将一个类型转换为另一个类型,提高了代码的简洁性,但同时也需要注意滥用可能带来的问题。 4. **Collections Library**:Scala的集合库在2.8.x版本进行了...

    Scala-with-cats

    隐式是一个非常强大的Scala特性,它允许在没有显式指定的情况下传递某些参数或对象。隐式解析是指Scala编译器如何在当前作用域中寻找合适隐式值的过程。了解这些知识点对于使用Cats库是至关重要的。 接着,《Scala ...

    scala by examples

    9. 隐式参数和转换(Implicit Parameters and Conversions):Scala允许使用隐式参数,这在编写库代码时非常有用,因为它可以减少方法调用时的繁琐性。同时Scala还支持隐式类型转换,这可以使得代码在类型系统中更加...

    Scala语言规范中文教程

    - **隐式参数**:通过`implicit`修饰的参数可以在上下文中自动查找。 10. **Scala与其他技术的集成** - **Java互操作性**:Scala可以无缝调用Java代码,反之亦然。 - **Spark大数据处理**:Scala是Apache Spark...

    Scala Functional Programming Patterns

    5. 隐式转换(Implicit Conversions):Scala的隐式转换允许将一个类型自动转换为另一个类型,这为库的设计提供了灵活性,允许在不修改现有代码的情况下扩展类型的功能。 《Scala Functional Programming Patterns...

    splain:scala更好的隐式错误

    现在,当你遇到隐式转换问题时,编译器会给出更丰富的信息,比如哪些隐式参数被尝试,但为什么没有成功,这将极大地提高调试效率。 除了改善错误消息,splain还支持一些额外的命令行选项,如`-Xshow-implicit`,它...

    A.Beginner's.Guide.to.Scala

    然而,Scala的面向对象编程与传统的OOP语言(例如C++和Java)有所不同,它具有更丰富的语言特性,如特质(trait)、隐式转换(implicit conversion)和case类(case class),这些特性使得Scala的面向对象编程更加...

    Scala—— 12.隐式转换

    隐式转换函数是以implicit关键字声明的带有单个参数的函数,这种函数将会自动应用,将值从一种类型转换为另一种类型。 object boke_demo01 { def main(args: Array[String]): Unit = { //编写一个隐式函数转成 ...

    kafka-serde-scala:隐式将类型类编码器转换为kafka序列化器,反序列化器和Serde

    `kafka-serde-scala` 库提供了一个方便的解决方案,它将Scala类型类编码器自动转换为Kafka的序列化器(Serializer)、反序列化器(Deserializer)以及Serde(序列化/反序列化器的组合)。这个库特别适用于那些希望在...

    scala学习笔记

    - **隐式转换**:通过 `implicit` 关键字定义隐式转换规则,可以在编译时自动转换类型。 - **延迟初始化**:使用 `lazy` 关键字定义变量,该变量只在首次使用时计算并存储结果。 - **异常处理**:Scala 提供了丰富的...

    Scala-简易详解文章

    17. **隐式转换(Implicit)**:隐式转换允许在没有显式转换的情况下,根据上下文自动转换类型。它们可以用来简化API,但过度使用可能导致代码难以理解。 18. **并发编程**:Scala利用JVM的并发特性,如`Future`和`...

Global site tag (gtag.js) - Google Analytics