`
bit1129
  • 浏览: 1069829 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Scala十八】视图界定与上下文界定

 
阅读更多

Context Bound,上下文界定,是Scala为隐式参数引入的一种语法糖,使得隐式转换的编码更加简洁。

 

隐式参数

首先引入一个泛型函数max,用于取a和b的最大值

  def max[T](a: T, b: T) = {
    if (a > b) a else b
  }

 因为T是未知类型,只有运行时才会代入真正的类型,因此调用a > b是不正确的,因为T不确定,也就不确定T是否有>这个函数定义。

 

引入类型隐式转换,

因为Comparator类型是可比较较的,因此定义一个类型的隐式转换,将T转换为Comparator[T],

 


  def max[T](a: T, b: T)(implicit m: T => Comparator[T]) = {
    if (m.compareTo(a,b)< 0) b else a
  }

 

 

 

使用:

class A(val weight: Int)

object ContextBound {
  def max[T](a: T, b: T)(implicit m: T => Comparator[T]) = {
    if (m.compareTo(a,b)< 0) b else a
  }

  def main(args: Array[String]) {
    implicit def toComparator(obj: A) = new Comparator[A] {
          override def compare(o1: A, o2: A): Int = o1.weight - o2.weight;
    }

    println(max(new A(300), new A(400)).weight)


  }

 

上下文界定

 

 

Context Bound的目的是省略隐式值的书写:

 

  def max[T](a: T, b: T)(implicit m:Comparator[T]) = {
    if (m.compareTo(a, b) < 0) b else a
  }

 

ContextBound:

存在一个隐式值,这个隐式对象以参数T为泛型参数,实现某种操作

package examples.scala.implicits

import java.util.Comparator

class A(val weight: Int)

object ContextBound {


  def max[T: Comparator](a: T, b: T) = {
    val c = implicitly[Comparator[T]]
    if (c.compare(a, b) < 0) b else a
  }

  def main(args: Array[String]) {
    //implicitly查找的是类型为Comparator[T]的隐式值,而不是隐式类型转换函数
    implicit val toComparator = new Comparator[A] {
      override def compare(o1: A, o2: A): Int = o1.weight - o2.weight;
    }
    println(max(new A(300), new A(400)).weight)
  }
}

 

视图界定

存在一个类型转换函数,将T转换为Ordered[T]

object ViewBound {
  def max[T <% Ordered[T]](a: T, b: T) = {
    if (a.compare(b) < 0) b else a;
  }

  def main(args: Array[String]) {
    implicit def toOrdered(a: A) = new Ordered[A] {
      override def compare(that: A): Int = a.weight - that.weight
    }
    println(max(new A(300), new A(400)).weight)
  }
}

 

 

 

分享到:
评论

相关推荐

    scala课件.zip

    Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx ...泛型 上下界 视图界定 上下文界定 协变逆变不变.pptx AKKA.pptx 韩顺平_Scala语言核心编程.pdf

    scala3 scala3 scala3 scala3 scala3

    例如,`given` 关键字用于提供上下文实例,这在类型类和依赖类型推断中特别有用,使得代码更加简洁。 函数字面量的语法也得到了简化。在Scala3中,你可以使用单表达式函数,而无需使用`=&gt;`。例如,`x =&gt; x + 1` ...

    scala sdk scala-2.12.3

    6. **IDE支持**:Scala SDK还与IntelliJ IDEA、Eclipse等集成开发环境集成,提供代码补全、调试和其他高级开发功能。 7. **类型系统**:Scala拥有强大的类型系统,包括类型推断、模式匹配、高阶类型和抽象类型等,...

    viewducers:Scala集合视图遇到Transducers的炒作

    基于以下项目: : 。 VIEWDUCTION-传感器(折叠变压器)和Scala集合视图的交集。... 该换能器库经过优化,可与当前形式的Scala集合库一起使用。 在本自述文件中,我们将不深入研究换能器的细节,

    Effective Scala中文版

    7. **隐式转换与上下文绑定**:Scala的隐式转换和上下文绑定是其一大特色,它们可以用来解决类型转换的繁琐和简化API。但隐式转换需要谨慎使用,防止引入难以调试的问题。 8. **对象与模块化**:Scala中的对象和...

    scala-2.10.4.rar

    3. **更好的类型推断(Improved Type Inference)**:通过增加`_`通配符和上下文界定(context bounds),使类型推断更加智能,减少了冗余的类型声明。 4. **并发和并行性增强(Concurrency and Parallelism ...

    scala2.12.1Windows镜像包

    - **安装**:`scala-2.12.1.msi`是一个Windows安装程序,用于在Windows系统上安装Scala开发环境,包括Scala编译器(scalac)和Scala REPL(Read-Eval-Print Loop)。 - **集成开发环境**:通常配合IDEA或IntelliJ ...

    scala-2.12.10.tgz

    6. Scala与Java互操作性:Scala可以在Java项目中无缝集成,因为它是JVM上的语言。可以调用Java库,反之亦然,这使得迁移现有Java项目到Scala变得容易。 7. 函数式编程:Scala支持高阶函数、闭包和不可变数据结构,...

    scala入门精华讲义

    3. 隐式转换:Scala支持隐式转换,允许在特定上下文中将一个类型转换为另一个类型,提高代码的简洁性。 三、函数式编程概念 1. 高阶函数:如前所述,函数可以作为一等公民,可以赋值给变量、作为参数或返回结果。 ...

    scala-2.12.14.zip&scala-2.12.11.tgz Linux版本压缩包.rar

    1. **类型推断**:开发者无需为每条语句都指定类型,编译器可以根据上下文自动推断。 2. **模式匹配**:允许通过模式来解构复杂数据结构,简化代码并提高可读性。 3. **函数式编程**:支持高阶函数、柯里化、尾递归...

    eclipse-Scala插件

    Scala插件提供了对Scala语法的完整支持,包括智能感知(IntelliSense)功能,它能根据上下文提供代码补全建议,帮助开发者快速编写代码。此外,还有错误检查和警告提示,这些实时反馈有助于早期发现并修复问题。代码...

    scala实战高清讲解

    - 类与对象:Scala中的所有数据都是对象,类是创建对象的模板。它支持单例对象和伴生对象,这为设计模式提供了简洁的实现。 - 函数:Scala将函数视为一等公民,可以作为变量赋值、作为参数传递和作为返回值。函数...

    scala-2.12.10.zip

    2.12.x版本的Scala致力于向后兼容,这意味着大多数2.11.x版本的代码可以无需修改直接在2.12.x上运行。然而,由于编译器和语言特性的改进,可能需要更新某些库或依赖项以获得最佳效果。 在Windows上安装Scala ...

    scala从入门到进阶

    - **类型推断**:Scala编译器可以根据上下文推断出变量的类型,减少显式的类型声明。 - **高阶类型**:允许定义和使用参数化的类型,如List[T],增强了代码的通用性。 - **隐式转换**:在适当的情况下,Scala可以...

    Scala语法简明教程

    - **与Java和C#无缝集成**:Scala能够在JVM上运行,因此可以直接访问Java库,与Java程序无缝协作;同时也支持.NET平台,可以调用.NET库。 - **生态圈**:Scala被许多知名公司采用,包括LinkedIn、Twitter、Novell...

    scala + mybatis 数据库查询

    在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与MyBatis结合,实现高效的数据库查询功能。 1. **Scala与MyBatis的集成** - Scala的静态类型系统和强大的表达能力使其成为构建复杂应用程序的...

    idea-scala插件

    自动完成功能能根据上下文提供相关的类、方法和变量建议,极大提高了开发效率。 ### 三、语法检查与错误提示 在编写代码时,Idea-Scala插件会实时进行语法检查,并在出现错误或警告的地方用波浪线进行标记。这有助...

    Scala考试题1

    15. **Java 集合与 Scala 集合的转换**: - 导入 `scala.jdk.CollectionConverters`,可以使用 `.asJava` 和 `.asScala` 转换。 16. **函数 values**: - 编写一个函数,根据给定区间和函数,生成对应的输入输出...

    scala-2.11.12 win msi 安装包

    8. **与Java兼容**:Scala是基于JVM的语言,可以调用所有的Java库,反之亦然,使得已有的Java代码能够与Scala代码一起工作。 9. **Akka框架**:Scala通常与Akka框架一起使用,提供高效、容错的并发处理能力。 10. ...

Global site tag (gtag.js) - Google Analytics