Scala:泛型函数上的匹配大小写
是否可以对函数执行Scala:泛型函数上的匹配大小写,scala,Scala,是否可以对函数执行匹配case? 我想为不同类型的函数定义一个行为。假设我有以下几种可能性: f:T=>Int f:T=>String f:T=>Lis[Int] f:T=>Boolean f:T=>Double 对于每个选项,我都有一个函数;例如,对于Int输出: def doThisForInt(f:T=>Int)={…} 对于Boolean输出: ` def doThisForBoolean(f:T=>Boolean)={…} 现在假设给出了一个函数定义:valf=(输入:T)=
匹配case
?
我想为不同类型的函数定义一个行为。假设我有以下几种可能性:
f:T=>Int
f:T=>String
f:T=>Lis[Int]
f:T=>Boolean
f:T=>Double
- 李>
Int
输出:
def doThisForInt(f:T=>Int)={…}
对于Boolean
输出:
`
def doThisForBoolean(f:T=>Boolean)={…}
现在假设给出了一个函数定义:valf=(输入:T)=>true
。我们应该选择对应的大小写f:T=>Boolean
请注意,所有这些函数的输出类型不同。或者,给定f
我可以获取此函数的输出类型吗?是您需要的:
import scala.reflect.runtime.universe._
def doThisForInt(f: T => Int) = ???
def printType[R: TypeTag](f: T => R) = typeOf[R] match {
case t if t =:= typeOf[Int] =>
val toInt: (T) => Int = f.asInstanceOf[T => Int]
doThisForInt(toInt)
case t if t =:= typeOf[Double] =>
// ...
case t if t =:= typeOf[List[Int]] =>
// ...
}
printType((x: T) => 1) // int
printType((x: T) => 2.0) // double
printType((x: T) => List(2)) // list
正如你所看到的,这是可能的,但不是非常优雅和反对
instanceOf检查链通常可以用虚拟方法替换(请参见),函数的结果类型可能是一个类型参数。在不了解更多用例上下文的情况下,很难给出更多建议。是您想要的:
import scala.reflect.runtime.universe._
def doThisForInt(f: T => Int) = ???
def printType[R: TypeTag](f: T => R) = typeOf[R] match {
case t if t =:= typeOf[Int] =>
val toInt: (T) => Int = f.asInstanceOf[T => Int]
doThisForInt(toInt)
case t if t =:= typeOf[Double] =>
// ...
case t if t =:= typeOf[List[Int]] =>
// ...
}
printType((x: T) => 1) // int
printType((x: T) => 2.0) // double
printType((x: T) => List(2)) // list
正如你所看到的,这是可能的,但不是非常优雅和反对
instanceOf检查链通常可以用虚拟方法替换(请参见),函数的结果类型可能是一个类型参数。如果不了解您的用例的更多上下文,就很难给出更多建议。您的用例是什么?听起来类型类更适合这种情况,因为一个巨大的匹配/案例是一种代码味道?像一个用于
f:T=>Int
,一个用于f:T=>Double
,等等?要使用匹配的方法的签名是什么?它不会接受t=>Int
,因为您希望它是泛型的,对吗?类似于:def doSomething[T,R](f:T=>R):代码>?应该返回什么?您的用例是什么?听起来类型类更适合这种情况,因为一个巨大的匹配/案例是一种代码味道?像一个用于f:T=>Int
,一个用于f:T=>Double
,等等?要使用匹配的方法的签名是什么?它不会接受t=>Int
,因为您希望它是泛型的,对吗?类似于:def doSomething[T,R](f:T=>R):代码>?应该退还什么?