Volevo sapere se c'è un equivalente dei delegati generici C # in Scala.
Il sito web di riferimento è: link
Sto cercando di fare un confronto completo tra C # e Scala, sulla (co) (contra) (in) varianza.
Volevo sapere se c'è un equivalente dei delegati generici C # in Scala.
Il sito web di riferimento è: link
Sto cercando di fare un confronto completo tra C # e Scala, sulla (co) (contra) (in) varianza.
Scala non ha delegati, ma sei libero di assegnare funzioni / lambdas alle variabili. Qui si applicano le normali regole di sottotitoli. Una funzione f: A => B
è un sottotipo di g: C => D
se l'argomento è un supertipo A > C
(controvarianza) e il tipo restituito è un sottotipo B < D
(controvarianza). Tieni presente che uno qualsiasi di questi quattro tipi potrebbe in realtà essere una tupla, quindi in questi casi verrà applicata la sottotipizzazione della tupla.
Esempio:
// two (sub-)types to demonstrate variance
class A()
class B() extends A
var delegate: Option[B => A] = None
// a few simple lambdas that can be assigned
delegate = Some((b: B) => new A()) // invariant
delegate = Some((b: B) => new B()) // return type covariance
delegate = Some((a: A) => new A()) // argument type contravariance
delegate = Some((a: A) => new B()) // co- and contravariance
// can we assign methods to function types? Yes!
class Context(retVal: A) {
def meth(b: B): A = retVal
}
val ctx = new Context(new A())
delegate = Some(ctx.meth _) // partial application
delegate = Some(b => ctx.meth(b)) // wrapping in lambda
Se aggiungiamo (più) generici, questo non cambia nulla poiché le funzioni sono già tipi generici in Scala. In particolare, la co- e controvarianza per le funzioni è disponibile perché le funzioni sono effettivamente definite come trait Function1[-T1, +R]
. I tipi definiti dall'utente possono anche fare uso della varianza se definiti correttamente.