加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中创建一个Map String – > Function

发布时间:2020-12-16 18:48:45 所属栏目:安全 来源:网络整理
导读:我需要将字符串映射到函数.我尝试了以下方法: def a(a: Int,..) = ... 表示具有各种参数的泛型函数, 然后 val m: Map[String,Funcs] = Map("a"- a) 哪里 type Funcs = (Any*) = Any 但它确实不起作用..我想用字符串作为键来制作混合函数的映射. 解决方法 这
我需要将字符串映射到函数.我尝试了以下方法:

def a(a: Int,..) = ...

表示具有各种参数的泛型函数,

然后

val m: Map[String,Funcs] = Map("a"-> a)

哪里

type Funcs = (Any*) => Any

但它确实不起作用..我想用字符串作为键来制作混合函数的映射.

解决方法

这并不容易.事实上,在运行时几乎不可能做到这一点.在编译时,你可以使用几个技巧,所有这些都可以在库 Shapeless中找到.你不必使用Shapeless作为 Miles showed in a gist,其中他解释说:

trait Assoc[K] { type V ; val value: V }
def mkAssoc[V0](k: String,v: V0): Assoc[k.type] { type V = V0 } = new Assoc[k.type]{ type V = V0 }

现在在编译时你可以匹配你需要的所有不同的东西

implicit def fAssoc = mkAssoc("f",f)
implicit def gAssoc = mkAssoc("g",g)

并将它们检索为

def lookup(k: String)(implicit assoc: Assoc[k.type]): assoc.V = assoc.value

如果你把这些推到像他用HMap完成的课程中,你可以按照Poly1的方式做一些事情:

abstract class FMapper{
  protected def mkAssoc[V0](k: String,v: V0): Assoc[k.type] { type V = V0 } = 
    new Assoc[k.type]{ type V = V0 }

  def apply(k: String)(implicit assoc: Assoc[k.type]): assoc.V = assoc.value

并创建一个类,如

class Mapped extends FMapper{
  implicit val f = mkAssoc("f",f)
  implicit val g = mkAssoc("g",g)

但正如你所看到的,它开始变得丑陋……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读