相等类型的模式匹配元组元素

问题描述

我正在两个对象的元组上进行模式匹配,并且想要匹配object1object2类型相同的所有情况,例如

(object1,object2) match {
    case (o1: T,o2: T) =>
      // Ignore same objects case
    case
    .
    .
    .
    case (_,_)
      // Here I can be certain that the two object are not of the same type
  

解决方法

尝试

def test(object1: Any,object2: Any) = (object1,object2) match {
  case (o1,o2) if o1.getClass == o2.getClass => println("same")
  case (_,_) => println("different")
}

test(1,2) //same
test(1,"2") //different
test(1: Any,"2": Any) //different
test(Some(1),Some("2")) //same

import scala.reflect.runtime.universe._
def getType[T: TypeTag](t: T): Type = typeOf[T]

def test[A: TypeTag,B: TypeTag](object1: A,object2: B) = (object1,o2) if getType(o1) == getType(o2) => println("same")
  case (_,"2": Any) //same
test(Some(1),Some("2")) //different

def test[A,B](object1: A,object2: B)(implicit ev: A =:= B) = println("same")

test(1,2) //compiles
// test(1,"2") //doesn't compile
test(1: Any,"2": Any) //compiles
// test(Some(1),Some("2")) //doesn't compile

如果object1object2实际上是(大小写)对象,那么最简单的是

def test(object1: A,object2: A) = (object1,o2) if o1 == o2 => println("same")
  case (_,_) => println("different")
}

sealed trait A
case object B extends A
case object C extends A

test(B,B) //same
test(B,C) //different
,

@Dmytro答案的另一种变化: 您可以使用TypeTag

代替ClassTag
import scala.reflect.ClassTag
def test[A: ClassTag,B: ClassTag](object1: A,object2: B): Unit =
  (object1,object2) match {
    case (_: A,_: A) => println("same")
    case (_,_)       => println("different")
  }

test(1,11)   // same
test(1,"11") // different

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...