unapply.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 134 行

SCALA
134
字号
import scala.testing.SUnit._object Test extends TestConsoleMain {  def suite = new TestSuite(    Foo,    Mas,    LisSeqArr,    StreamFoo  )}// this class is used for representationclass Bar {  var size: Int    = 50  var name: String = "medium"}// test basic unapply for 0, 1 and 2 args and with precise type testobject Fii {  def unapply(x: Any): boolean = x.isInstanceOf[Bar]}object Faa {  def unapply(x: Any): Option[String] = if(x.isInstanceOf[Bar]) Some(x.asInstanceOf[Bar].name) else None}object FaaPrecise {  def unapply(x: Bar): Option[String] = Some(x.name) }object FaaPreciseSome {  def unapply(x: Bar) = Some(x.name)  // return type Some[String]}object VarFoo {  def unapply(a : Int)(implicit b : Int) : Option[Int] = Some(a + b)}object Foo extends TestCase("Foo") with Assert {  def unapply(x: Any): Option[Product2[Int, String]] = x match {    case y: Bar => Some(Tuple(y.size, y.name))    case _ => None  }  def doMatch1(b:Bar) = b match {      case Foo(s:Int, n:String) => (s,n)  }  def doMatch2(b:Bar) = b match {      case Fii() => null  }  def doMatch3(b:Bar) = b match {      case Faa(n:String) => n  }  def doMatch4(b:Bar) = (b:Any) match {    case FaaPrecise(n:String) => n  }  def doMatch5(b:Bar) = (b:Any) match {    case FaaPreciseSome(n:String) => n  }  override def runTest {    val b = new Bar    assertEquals(doMatch1(b),(50,"medium"))    assertEquals(doMatch2(b),null)    assertEquals(doMatch3(b),"medium")    assertEquals(doMatch4(b),"medium")    assertEquals(doMatch5(b),"medium")    implicit val bc: Int = 3    assertEquals(4 match {      case VarFoo(x) => x    }, 7)  }}// same, but now object is not top-levelobject Mas extends TestCase("Mas") with Assert {  object Gaz {    def unapply(x: Any): Option[Product2[Int, String]] = x match {      case y: Baz => Some(Tuple(y.size, y.name))      case _ => None    }  }  class Baz {    var size: Int    = 60    var name: String = "too large"  }  def runTest {    val b = new Baz    assertEquals(b match {      case Gaz(s:Int, n:String) => (s,n)    }, (60,"too large"))  }}object LisSeqArr extends TestCase("LisSeqArr") with Assert {//  def foo[A](x:List[A]) {}  def runTest {    assertEquals((List(1,2,3): Any) match { case   List(x,y,_*) => (x,y)}, (1,2))    assertEquals((List(1,2,3): Any) match { case    Seq(x,y,_*) => (x,y)}, (1,2))    assertEquals((Array(1,2,3): Any) match { case   Seq(x,y,_*) => (x,y)}, (1,2))    //assertEquals((Array(1,2,3): Any) match { case Array(x,y,_*) => {x,y}}, {1,2})    // just compile, feature request #1196//    (List(1,2,3): Any) match { //      case a @ List(x,y,_*) => foo(a)//    }  }}object StreamFoo extends TestCase("unapply for Streams") with Assert {  //val x:Stream[Int] = Stream.cons(1,x)  def sum(stream: Stream[int]): int =    stream match {      case Stream.empty => 0      case Stream.cons(hd, tl) => hd + sum(tl)    }  override def runTest {    val str: Stream[int] = Stream.fromIterator(List(1,2,3).elements)    assertEquals(sum(str), 6)  }}object Test1256 extends TestCase("1256") {  class Sync {    def unapply(scrut: Any): Boolean = false  }    class Buffer {    val Get = new Sync        val jp: PartialFunction[Any, Any] = {      case Get() =>    }  }    override def runTest { assertFalse((new Buffer).jp.isDefinedAt(42)) }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?