假设我有一个这样的函数列表:
val funcList = List(func1: A => T, func2: B => T, func2: C => T)
(其中 func1
等在别处定义)
我想编写一个方法,该方法将获取一个值并根据确切类型将其匹配到正确的函数(匹配 a: A
与 func1: A => T
) 或者如果没有匹配的函数则抛出异常。
有没有简单的方法来做到这一点?
这类似于 PartialFunction
所做的,但我无法将 funcList
中的函数列表更改为 PartialFunctions。我在想我必须将函数隐式转换为一个特殊的类,该类知道它可以处理的类型并能够对其进行模式匹配(基本上将这些函数提升为专门的 PartialFunction
)。但是,我不知道如何识别每个函数的“域”。
谢谢。
最佳答案
您无法识别每个函数的域,因为它们在运行时被删除。如果您想要更多信息,请查找删除,但缺点是您想要的信息不存在。
类型删除有多种方法,您会发现很多关于 Stack Overflow 本身的讨论。其中一些归结为将类型信息作为值存储在某处,以便您可以匹配。
另一种可能的解决方案是简单地放弃使用参数化类型(Java 用语中的泛型)为您自己的自定义类型。也就是说,做类似的事情:
abstract class F1 extends (A => T)
object F1 {
def apply(f: A => T): F1 = new F1 {
def apply(n: A): T = f(n)
}
}
等等。由于 F1
没有类型参数,你可以在其上进行匹配,并且可以轻松创建这种类型的函数。假设 A
和 T
都是 Int
,那么你可以这样做,例如:
F1(_ * 2)
关于scala - 根据类型将值与函数匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14657705/