当前位置:首页 > 开发 > 编程语言 > Scala > 正文

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

发表于: 2015-06-13   作者:bit1129   来源:转载   浏览:
摘要: Context Bound,上下文界定,是Scala为隐式参数引入的一种语法糖,使得隐式转换的编码更加简洁。   隐式参数 首先引入一个泛型函数max,用于取a和b的最大值 def max[T](a: T, b: T) = { if (a > b) a else b }  因为T是未知类型,只有运行时才会代入真正的类型,因此调用a >

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十八】视图界定与上下文界定

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Entity Framework模型在领域驱动设计界定上下文中的应用 【本文翻译自Julie Lerman发表在MSDN Magaz
被这个烂问题折磨的死去活来,同样一段代码 <?php echo <<<END ssdsdad END; ?> 在
下午开会讨论了关于系统架构设计问题,也引申出关于架构图中包间关系的思考。 其实,主要分歧点是在
引言:今天小崔问了我一个问题,把我问中了,包与包之间都有哪几种关系,为什么用依赖而不用关联,
转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8245964 作者:张燕
转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8245964 作者:张燕
  内核空间和用户空间是现代操作系统的两种工作模式,内核模块运行在内核空间,而 用户态应用程序
内核空间和用户空间是现代操作系统的两种工作模式,内核模块运行在内核空间,而 用户态应用程序运行
9 视图
原文链接地址:http://www.cnblogs.com/lyhabc/p/3801527.html 这一篇《我的MYSQL学习心得(十一)
(一)、类型强制策略的安全上下文 所有的操作系统访问控制都是基于与主体和客体相关的访问控制属性
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号