2017-08-02 50 views
1

内部函数我有一个地图,我想创造这样的:调用存储的地图

val mapCastMethods = Map("Integer" -> toInt) 

然后,我想打电话给repviously随地图存储的方法。 类似于:

"345".mapCastMethods("Integer") 

我该怎么做?

回答

3

我觉得这样的事情应该工作:

val toInt = (x: String) => x.toInt 

    val mapCastMethods = Map("Integer" -> toInt) 


    val res = mapCastMethods("Integer")("345") // [EDIT] Same as val res= mapCastMethods.get("Integer").get(("345")) 

    println(res) // 345 

你应该定义函数字面toInt FUNC :)的

+1

这是确定的,但可能会有点优化:'val结果:Int = mapCastMethods(“Integer”)(“345”)' –

+0

当然是啊:) – elarib

+0

我正在为scala中的关系运算符解决同样的问题。很高兴知道这个方法 –

1
type Cast[A, X] = A => X 
type CastMethods[K, A, X] = Map[K, Cast[A, X]] 

implicit def cast[K, A, X](implicit methods: CastMethods[K, A, X]): 
    K => A => X 
    = k => a => methods(k)(a) 

然后用法:

sealed trait CastMethod 
case object Integer extends CastMethod 
implicit val methods: CastMethods[CastMethod, String, Int] 
    = Map(Integer -> (_ : String).toInt) 

cast.apply(Integer)("345") 
+0

这是一个很好的抽象,但是如果你想从例如将'Set'设置为'List'?你的类型参数'X'已经绑定到'Int'。 你是否需要声明一个更隐含的val,每次新演员都会实例化一个带有单个元素的新“Map”? –

+0

我想我明白了。这将是'隐式val方法:CastMethods [CastMethod,Any,Any] = Map(Integer - >(_:String).toInt,Set - >(_:Set).toList)' –