Scala在上下文中隐式返回

时间:2014-08-11 12:19:41

标签: scala implicit

我想知道是否可以使用函数修改上下文中的隐式?

使用这样的语法

def modifyImplicit(implicit myImplicit: ImplicitType) : implicit ImplicitType {
        myImplicit.setSomthing(something)
        myImplicit
}

因为现在我必须返回一个类型,并在函数转换后以新的隐式 如果我需要不止一次地使用这个功能,它很快就会变得很痛苦。

3 个答案:

答案 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的解决方案可能更漂亮?