Sono abbastanza nuovo in Scala e ho cercato di imparare e comprendere conversioni e parametri impliciti e ho riscontrato uno scenario che trovo confuso.Parametro ed ereditarietà del costruttore di classi astratte implicite in Scala
Per contesto, sto utilizzando Scaldi per eseguire l'iniezione di dipendenza in un'applicazione Akka e vorrei che più attori iniettabili ereditassero da una classe astratta. Credo di non essere in grado di rendere la classe astratta un tratto proprio perché è necessario rendere disponibile un implicito Injector
tramite un argomento del costruttore per sfruttare il framework.
Un esempio molto artificiosa che presenta il comportamento che sto vedendo è la seguente:
class SecretSauce {}
abstract class Base(implicit secretSauce: SecretSauce) {}
class Concrete extends Base {}
object Example extends App {
... // Setup Actor system, etc, etc
implicit val secretSauce: SecretSauce = new SecretSauce()
}
mi aspettavo cose a lavorare, ma invece ottengo un errore di compilazione:
Unspecified value parameter secretSauce.
class Concrete extends Base {
^
Se io aggiungere il parametro implicito alla classe concreta, come tale, le cose funzionano:
class Concrete(implicit secretSauce: SecretSauce) extends Base {}
I t la mia confusione deriva da come funzionano i parametri impliciti - in situazioni come quella che sto descrivendo, non sono ereditate da classi di bambini? Qualcuno può ELI5 cosa sta succedendo nel mio esempio o mi indica un riferimento che può aiutare a chiarire le cose?
Grazie!
Ah, penso che la distillazione delle regole aiuti un bel po '. Perché un errore di compilazione non viene generato nel caso in cui l'argomento implicito è duplicato nella classe concreta? per esempio 'class Concrete (implicite secretSauce: SecretSauce) estende Base {}' Dal modo in cui l'ho impostato nel mio codice, il valore implicito non è ancora in ambito né è in un oggetto associato, giusto? La mia comprensione dell'ambito è qui fuori? – simonl
@simonl Quando si aggiunge il parametro implicito al costruttore 'Concrete', implicito sarà nell'ambito della chiamata al costruttore padre. La sintassi di Scala per le definizioni e i costruttori di classi lo rende un po 'poco intuitivo, ma funziona. –