zoukankan      html  css  js  c++  java
  • scala学习手记40

    前面两节我们已经多次接触过case关键字了。case关键字不仅可以用在match/case中来执行模式匹配,也可以用来修饰类。不过用case修饰的类也主要是用来做模式匹配。在上一节曾经提到过match可以是Any类型的所有类,为什么还需要使用case关键字来修饰呢?假定有这样一个场景:我们要接收和处理股票交易信息,买卖消息通常会带有一些信息,诸如股票名称、数量。把这些信息存到对象里会很方便,但是如何对他们进行模式匹配呢?这时我们就会用到case类了。case类是模式匹配器(pattern matcher)可以识别和匹配的类。

    下面是一个例子:

    abstract class Trade()
    
    case class Sell(stockSymbol: String, quantity: Int) extends Trade
    
    case class Buy(stockSymbol: String, quantity: Int) extends Trade
    
    case class Hedge(stockSymbol: String, quantity: Int) extends Trade
    
    
    class TradeProcessor {
      def processTransaction(request: Trade) {
        request match {
          case Sell(stock, 1000) => println("Selling 1000-units of " + stock)
          case Sell(stock, quantity) => printf("Selling %d units of %s
    ", quantity, stock)
          case Buy(stock, quantity) if (quantity > 2000) => printf("Buying %d (large) units of %s
    ", quantity, stock)
          case Buy(stock, quantity) => printf("Buying %d units of %s
    ", quantity, stock)
        }
      }
    }

    这里,用request匹配Sell和Buy。如果接收到的股票代码和数量得到匹配,就会分别存储到模式变量stock和quantity里。这里还用到特定常量值(比如quantity为1000)或是卫述句(比如检查if quantity > 2000)进行匹配。

    此时我们已经为Trade类准备了三个实现,我们并不需要其它的实现,更不希望其他人再实现这个trait。此时,我们可以使用sealed关键字来限制只能在当前文件下实现这个trait。就像这样:

    sealed abstract class Trade()
    
    case class Sell(stockSymbol: String, quantity: Int) extends Trade
    
    case class Buy(stockSymbol: String, quantity: Int) extends Trade
    
    case class Hedge(stockSymbol: String, quantity: Int) extends Trade

    在上面的代码中,Trade的所有实现case类都有参数。当一个case类没有参数时,记得在使用的时候一定要加上括号,不然传递的不再是这个类的实例,而是它的伴生对象。这个伴生对象混入了scala.Function0 trait,这意味着它可以当作函数用。所以,最终传入的是一个函数,而不是case类的实例。

    #################

  • 相关阅读:
    caffe杂
    easyui 扩展layout的方法,支持动态添加删除块
    easyui换主题,并记录在cookie
    $.messager.show扩展:指定位置显示
    easyui 扩展 之 Tree的simpleData加载
    easyui menu 添加hideItem/showItem 方法
    HTML标签及属性大全
    适应各种内核浏览器的透明修过样式
    让IE6支持min-width和max-width的方法
    javascript获取html标记的的绝对定位值
  • 原文地址:https://www.cnblogs.com/amunote/p/5890656.html
Copyright © 2011-2022 走看看