У меня есть идея (расплывчатое), чтобы передать (или цепи) некоторое неявное значение таким образом, не вводя параметры, чтобы блокировать f
:неявный параметр «цепочки» для DSL
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
s не нужны, просто намек, чтобы подчеркнуть, что я не хочу передавать этот аккумулятор явно). Конечно, верхний код напечатает 0.
EDIT: Одно из возможных использований: (? Как) составление HTTP маршрутов, в следующем порядке
prefix("path") {
prefix("subpath") {
post("action1") { (req, res) => do action }
get("action2") { (req, res) => do action }
}
}
Здесь post
и get
будет доступ накопленного префикса, скажем List("path", "subpath")
или "/path/subpath/"
.
Это именно то, что мне нужно, спасибо! Никогда не слышал об этом :) – dmitry