Unit)(implicit v: Int) = { impl-6ren">
gpt4 book ai didi

scala - DSL 的隐式参数 "chaining"

转载 作者:行者123 更新时间:2023-12-01 00:49:25 25 4
gpt4 key购买 nike

我有一个想法(模糊),以这种方式传递(或链接)一些隐式值,而不是将参数引入块 f :

def block(x: Int)(f: => Unit)(implicit v: Int) = {
implicit val nv = v + x
f
}

def fun(implicit v: Int) = println(v)

这样,如果我使用类似的东西:
implicit val ii: Int = 0
block(1) {
block(2) {
fun
}
}

它会打印 3 .

如果我能说 def block(x: Int)(f: implicit Int => Unit) .

换句话说,我正在寻找一些设计模式,它允许我实现这个 DSL:访问嵌套块内的一些累积值,但不显式将其作为参数传递。是否可以? ( implicit 不是必需的,只是一个提示,以强调我不想明确传递该累加器)。当然上位码会打印0。

编辑:一种可能的用法:以下列方式组成 http 路由
prefix("path") {
prefix("subpath") {
post("action1") { (req, res) => do action }
get("action2") { (req, res) => do action }
}
}

这里 postget将访问(如何?)累积前缀,比如 List("path", "subpath")"/path/subpath/" .

最佳答案

考虑使用 DynamicVariable 为了这。它使用起来非常简单,并且是线程安全的:

val acc: DynamicVariable[Int] = new DynamicVariable(0)

def block(x: Int)(f: => Unit) = {
acc.withValue(acc.value + x)(f)
}

def fun = println(acc.value)

关于scala - DSL 的隐式参数 "chaining",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32253265/

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