【问题标题】:simple scala macro简单的 scala 宏
【发布时间】:2013-02-14 14:19:03
【问题描述】:

我想要一个执行以下操作的 scala 宏: 当我写的时候:

myCreateCityMacro("paris")
myCreateCityMacro("vallorbe")

我想得到:

val paris = new City("paris")
val vallorbe = new City("vallorbe")

【问题讨论】:

  • val x = new X("x") 在 Scala 中不是一个简单的表达式,因此不能像您想的那样由宏返回。我认为最适合您的情况的方法是 val x = city,它是 city 一个通过检查上下文调用的前缀来推断城市名称的宏。
  • Ops,我弄错了,context.prefix 无法访问 val 的名称。

标签: scala scala-macros scala-2.10


【解决方案1】:

这可以使用 scala 动态特性来解决:

import scala.language.dynamics

object Cities extends App {
    var c = new DynamicMap[String, City]()
    createCity("Paris")
    createCity("Vallorbe")
    println(c.Paris, c.Vallorbe)

    def createCity(name: String) {
        c.self.update(name, new City(name))
    }
}

class City(name: String) {
    override def toString = s"-[$name]-"
}

class DynamicMap[K, V] extends Dynamic {
    val self = scala.collection.mutable.Map[K, V]()
    def selectDynamic(key: K) = self(key)
}

执行时:

(-[Paris]-,-[Vallorbe]-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2016-10-13
    • 2013-10-23
    • 1970-01-01
    相关资源
    最近更新 更多