【发布时间】:2011-08-15 18:33:55
【问题描述】:
我希望能够在这些行上做一些事情(不会编译):
def logScope(logger:Logger)(operation: (implicit l:Logger) => Unit) {/* code */ operation(logger) /* code */}
def operationOne(implicit logger:Logger) {/**/}
def operationTwo(implicit logger:Logger) {/**/}
然后像这样使用它:
logScope(new ConsoleLogger){logger =>
operationOne
operationTwo
}
但我最接近的可行解决方案是:
def logScope(logger:Logger)(operation: Logger => Unit) {/* code */ operation(logger) /* code */}
def operationOne(implicit logger:Logger) {/**/}
def operationTwo(implicit logger:Logger) {/**/}
/* other code */
logScope(new ConsoleLogger){logger =>
implicit val l = logger
operationOne
operationTwo
}
我认为该语言目前不允许这样的结构,但是,有什么建议或变通方法可以达到类似的结果吗?
小更新:我已经created a gist 对上述代码进行了稍微扩展的版本,并尝试了几次模拟这种文字。目前为止,CheatEx 的版本是最好的。
【问题讨论】:
-
这样做的动机是什么?您编写的代码块似乎为零值。您显式定义隐式,然后将其隐式传递给代码......为什么不首先显式传递它呢?我知道您正在尝试在这里做一件特定的事情-当然-但我认为您正在做的事情令人困惑……为什么不直接将对象传递进去?
-
@derek 这是loan pattern 在工作。我同意 logScope 代码可能不那么愚蠢。
-
我知道这是贷款模式 - 我没有得到的是篮球。在这里使用
operationOne(logger)和operationTwo(logger)似乎是合适的。 -
@derek 如果您必须在 50 个不同的地方使用 scope,这会变得有点烦人。 logScope 可以是 sessionScope、fileScope 或任何数量的其他 范围,其方法使用特定资源(无论是注入的还是其他方式)。不必每次都指定参数。
标签: scala parameters implicit function-literal