是否可以在Scala中使用名称和命名参数的值来创建Map [String,Any
发布时间:2020-12-16 18:59:59 所属栏目:安全 来源:网络整理
导读:我正在编写REST Web服务的包装器,我想要强类型的 Scala API. 以下是我到目前为止所做的事情: def getMentions(count: Option[Int] = None,sinceID: Option[TweetID] = None,maxID: Option[TweetID] = None,trimUser: Option[Boolean] = None,contributorDet
我正在编写REST Web服务的包装器,我想要强类型的
Scala API.
以下是我到目前为止所做的事情: def getMentions(count: Option[Int] = None,sinceID: Option[TweetID] = None,maxID: Option[TweetID] = None,trimUser: Option[Boolean] = None,contributorDetails: Option[Boolean] = None,includeEntities: Option[Boolean] = None) : List[Tweet] = { val parameters = Map("count" -> count,"since_id" -> sinceID,"max_id" -> maxID,"trim_user" -> trimUser,"contributor_details" -> contributorDetails,"include_entities" -> includeEntities) /* * Convert parameters,which is a Map[String,Any] to a Map[String,String] * (Removing Nones) and pass it to an object in charge of generating the request. */ ... } 这种方法很有效,但它需要我手动生成参数图. 解决方法
你可以用运行时反射做到这一点,我相信你会得到答案告诉你如果你想要的话,但这实际上是
Scala 2.10’s macros的一个简洁用例,所以这里就是这样.首先假设我们有一个名为ParamMapMaker.scala的文件:
object ParamMapMaker { def paramMap: Map[String,Any] = macro paramMapImpl def paramMapImpl(c: scala.reflect.macros.Context) = { import c.universe._ val params = c.enclosingMethod match { case DefDef(_,_,ps :: Nil,_) => ps.map(p => reify(( c.Expr[String](Literal(Constant(p.name.decoded))).splice,c.Expr[Any](Ident(p.symbol)).splice )).tree ) case _ => c.abort(c.enclosingPosition,"Can't call paramMap here!") } c.Expr[Map[String,Any]](Apply(Select(Ident("Map"),"apply"),params)) } } 我会留下蛇套管地图键作为读者的(简单)练习. 我们还有一个测试文件(名为Test.scala): object Test extends App { def foo(hello: String,answer: Int) = ParamMapMaker.paramMap println(foo("world",42)) } 现在我们编译这两个: scalac -language:experimental.macros ParamMapMaker.scala scalac Test.scala 当我们运行Test时,我们将获得以下信息: Map(hello -> world,answer -> 42) 关于这一点的好处是没有运行时反射的开销.如果我们使用-Ymacro-debug-verbose编译测试文件,我们会看到在编译时为foo的主体生成了以下代码(实际上): Map.apply[String,Any]( scala.Tuple2.apply[String,String]("hello",hello),scala.Tuple2.apply[String,Int]("answer",answer) ) 正如我们所期望的那样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |