info("almost") case s: S-6ren">
gpt4 book ai didi

Scala DSL - 函数对象的隐式方法

转载 作者:行者123 更新时间:2023-12-04 05:31:40 24 4
gpt4 key购买 nike

在我的 DSL 中,我希望能够这样做:

val a = 5

Parse("TYPE") {
a match {
case 3 => info("almost")
case s: String => error("wrong type")
case 5 => info("you won!")
case _ => error("omg")
}
}

带输出
[INFO] TYPE: you won!

哪里 Parse是一个函数对象,它有 apply(String) , info(String)error(String)方法:
object Parse {

def apply(name: String)(parseF: => Unit) { parseF }
def info(text: String) { println("[INFO] " + name + ": " + text) }
def error(text: String) { println("[ERROR] " + name + ": " + text) }

}

诀窍在于 info 的输出和 error方法应该以某种方式原生于 Parse对象并通过如上所示的示例构造消息。因此,他们
  • 必须像示例中一样可以访问,没有任何导入。
  • 必须有权访问传递给 Parse() 的第一个参数(示例中的“类型”)。
  • 在工作期间不得创建任何实例或额外的对象。

  • 这是一个理想的描述。我认为这将需要更多样板。请建议,我怎样才能做到这一点?

    编辑:我最初的猜测是声明 infoerror apply 中的方法方法不会使它们在 parseF 中可见方法被传递。嗯,不出所料。。

    最佳答案

    没有满足 1-3 的解。您可以使用语法稍有不同的 1 和 2 或 2 和 3。

    1 和 2)

    class Parse(val s:String) {
    def info....

    }

    new Parse("TYPE") {

    }

    2 和 3)
    object Parse {
    def apply(s:String)(f:String=>Unit) = ...
    }

    Parse("TYPE")(s => {

    })

    关于Scala DSL - 函数对象的隐式方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12493345/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com