我想知道是否可以使用函数修改上下文中的隐式?
使用这样的语法
def modifyImplicit(implicit myImplicit: ImplicitType) : implicit ImplicitType {
myImplicit.setSomthing(something)
myImplicit
}
因为现在我必须返回一个类型,并在函数转换后以新的隐式 如果我需要不止一次地使用这个功能,它很快就会变得很痛苦。
答案 0 :(得分:2)
这会引入副作用(在没有太多注意的情况下自动改变环境),它不是“非常好”。
相反,您可以允许在托管上下文中执行某些操作,在托管上下文中明确提供隐式替换。
implicit def TheDefaultTypeClass: ImplicitType
def withMyContext[T](f: (ImplicitType) => T): T = f(anotherTypeClass)
然后可以使用如下:
val s: String = withMyContext { i =>
val x: ImplicitType = i // Dumb statement just to check type of `i`
// some operations ...
"OK" // result
}
答案 1 :(得分:2)
不,这是不可能的。你可以写
implicit def modifyImplicit(implicit myImplicit: ImplicitType): ImplicitType = ...
但是这不会按照你想要的方式工作(因为要调用它,这种类型的隐式必须已经可用,所以要么编译器不能继续查找隐式的,要么将报告相互矛盾的含义。)
此外,拥有可变隐式值似乎很可能导致错误。
一种可能的解决方法(除了applicius提出的方法之外):将代码提取到方法中并使用修改后的隐式值调用它。
def myMethod(args: ...)(implicit i: ImplicitType) = ...
myMethod(args)(modifyImplicit(implicitly[ImplicitType]))
答案 2 :(得分:0)
是的我现在但隐含是可变的,因为: ```
def modifyImplicit(implicit myImplicit: ImplicitType) {
implicit val myNewImplicit = myImplicit.setSomthing(something)
imASweetMethodWitchUseImplicit
....
}
```
imASweetMethodWitchUseImplicit将使用上下文中设置的最后一个隐式,因此我们不能“卡住隐含的可变性” 我实际上就是用它制造我的方式,但我觉得它有点难看。
我这样做是为了“准备”其他函数的上下文所以我很有信心,因为它只是隐藏变量而不是调用我的函数(修改变量)你知道吗?
所以阿列克谢我使用的选项与你相同,但我直接采用非隐式方式。 如果我调用多个函数就会变得难看
```
val result = modifyImplicit()
val result2 = modifyImplicit(result)
implicit val result3 = modifyImplicit(result2)
```
那么也许appius的解决方案可能更漂亮?