簡體   English   中英

Scala在上下文中隱式返回

[英]Scala return implicit in the context

我想知道是否可以使用函數在上下文中修改隱式?

使用這樣的語法

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

因為現在我必須返回一個類型,然后在函數將其轉換為新的隱式后,如果我需要多次使用該函數,那么它將很快變得痛苦。

那會帶來副作用(自動改變環境而不會引起太多注意),因為它不是“很好”。

相反,您可以允許在托管上下文中執行某些操作,在該上下文中您顯式提供隱式的替換。

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
}

不,不可能。 你可以寫

implicit def modifyImplicit(implicit myImplicit: ImplicitType): ImplicitType = ...

但這無法按您想要的方式工作(因為要被調用,此類型的隱式必須已經可用,因此編譯器將不會繼續尋找隱式,否則它將報告沖突的隱式)。

同樣,具有可變的隱式值似乎很可能導致錯誤。

一種可能的解決方法(除了applicius提出的方法之外):將代碼提取到方法中,並使用修改后的隱式值進行調用。

def myMethod(args: ...)(implicit i: ImplicitType) = ...

myMethod(args)(modifyImplicit(implicitly[ImplicitType]))

是的,我現在但是隱式是可變的,因為:

def modifyImplicit(implicit myImplicit: ImplicitType)  {
       implicit val myNewImplicit =  myImplicit.setSomthing(something)
       imASweetMethodWitchUseImplicit
       .... 
}

```

imASweetMethodWitchUseImplicit將使用上下文中設置的最后一個隱式設置,因此我們不能“保留隱式的不可更改性”,實際上,這是我曾經做過的事情的方式,但我認為這有點丑陋。

我這樣做是為了“准備”其他人的函數的上下文,所以我有信心,因為它只是隱藏變量而不是函數的調用(巫婆修改變量),您知道嗎?

因此,Alexey我使用的選項與您相同,但我直接采用了非隱式。 如果我調用多個函數,它將變得很丑陋

```
val result = modifyImplicit()
val result2 = modifyImplicit(result)
implicit val result3 = modifyImplicit(result2)
```

那么,也許applicius的解決方案可以更漂亮?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM