【发布时间】:2015-07-14 13:13:42
【问题描述】:
如何创建字符串映射到具有泛型类型的函数?例如,我希望能够在编译时创建地图:
var unaryFunctionMap: Map[String, Any => Any] = Map[String, Any => Any]()
然后我想添加可以接受String、Int、Double 等类型组合的函数。可能以如下方式:
unaryFunctionMap += ("Abs" -> Functions.add)
unaryFunctionMap += ("Neg" -> Functions.neg)
unaryFunctionMap += ("Rev" -> Functions.rev)
我在 Functions 类中实现实际功能的地方:
def abs[T: Numeric](value: T)(implicit n: Numeric[T]): T = {
n.abs(value)
}
def neg[T: Numeric](value: T)(implicit n: Numeric[T]): T = {
n.negate(value)
}
def rev(string: String): String = {
string.reverse
}
所以,abs 和 neg 都允许 Numeric 类型,而 rev 只允许 Strings。当我使用地图时,我希望能够在必要时指定类型。像这样的:
(unaryFunctionMap.get("abs").get)[Int](-45)
或者,如果这不可能,
(unaryFunctionMap.get("abs").get)(Int, -45)
如何修改我的代码以实现此功能?
【问题讨论】:
-
你想用这个做什么?这种
Any => Any映射通常是Scala 中要避免的反模式。了解您的用例可能有助于回答者确定在此处使用的更好的设计模式。 -
我想创建一个函数名到函数的映射。这些函数可以是
String => String、Int => String、Double => Double等,所以我使用了Any =>。这些函数通常也是T: Numeric => T,所以我希望能够在运行时传入T是什么类型。 -
这很清楚。我正在尝试更好地了解您想将此地图用于什么目的。
-
我正在使用解析器将用户的表达式解析为函数和操作数。该映射包含该语言中的所有有效函数。
-
我不确定这是否是一个更好的问题,但更具体地说,这是我目前正在努力实现的目标:stackoverflow.com/questions/31395488/…
标签: scala