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

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

  • 相关阅读:
    JMeter接口测试系列:Jmeter+jenkins+ant 的自动化构建
    BZOJ1434:[ZJOI2009]染色游戏(博弈论)
    BZOJ4241:历史研究(回滚莫队)
    BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)
    BZOJ1188:[HNOI2007]分裂游戏(博弈论)
    BZOJ1022:[SHOI2008]小约翰的游戏John(博弈论)
    BZOJ1406:[AHOI2007]密码箱(数论)
    BZOJ3270:博物馆(高斯消元)
    CF993E:Nikita and Order Statistics(FFT)
    HDU4609:3-idiots(FFT)
  • 原文地址:https://www.cnblogs.com/amunote/p/5890656.html
Copyright © 2011-2022 走看看