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类的实例。

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

  • 相关阅读:
    C#操纵Excel,此工作薄包含嵌入对象,Office 2007的设定方法
    将本程序添加到自启动项
    .net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)
    Entity Framework 调用返回标量值的存储过程
    Dev控件 galleryControl
    Dev控件treeList
    Linux下USB驱动开发相关链接
    Linux下串口编程相关链接
    Linux常用命令操作说明(链接)
    Perl的主要应用领域
  • 原文地址:https://www.cnblogs.com/amunote/p/5890656.html
Copyright © 2011-2022 走看看