2012-08-23 14 views
7

Ho un metodo che chiama alcuni altri metodi che fanno uso di un implicito di tipo Foo. Mi piacerebbe renderlo implicito in Foo. Questo è come lo faccio:Contrassegno di un argomento implicito all'interno di un metodo

def myMethod(a: Int, f: Foo) = { 
    implicit val implicitF = f; 
    somethingThatNeedsFoo(a) 
} 

Non voglio segnare f implicita nella firma del mioMetodo poiché Foos non sono implicite nel contesto che mioMetodo è in uso. La mia domanda: esiste un modo più idiomatico (o conciso) per ottenere questo effetto rispetto all'utilizzo di una variabile temporanea?

+2

In questo semplice esempio, è probabilmente più semplice passare 'f' in modo esplicito piuttosto che usare impliciti, ma sto assumendo che il tuo codice reale sia abbastanza complesso da rendere l'implicito utile. In questo caso, penso che la soluzione per dichiarare un valore implicito all'interno del metodo sia il modo migliore per farlo se si vuole evitare di dichiarare il parametro stesso come implicito nella firma del metodo. – DaoWen

+0

@DaoDao Dovresti davvero inviare il tuo commento come risposta. –

+0

@ Aaron Novstrup - Sì, guardando le altre risposte che probabilmente dovrei avere. Sono ancora piuttosto nuovo qui, quindi ho ancora difficoltà a decidere cosa cade nella categoria di risposta vs commento. – DaoWen

risposta

4

È possibile passare esplicitamente i parametri impliciti, quindi anche se non c'è Foo nella portata implicita del chiamante, il chiamante può semplicemente passarlo esplicitamente.

Come commentato, è possibile utilizzare questo stesso trucco per passare il Foo a somethingThatNeedsFoo:

def myMethod(a: Int, f: Foo) = 
    somethingThatNeedsFoo(a)(f) 
6

Non ho mai visto questo essere effettivamente utilizzato, ma si può evitare vincolante la variabile a un nome. Utilizzando, naturalmente, la sottolineatura:

implicit val _ = f 

vorrei consigliare contro questo utilizzo, però.

+0

Qual è il motivo per sconsigliare questo utilizzo? Mi piace che eviti di inquinare lo spazio dei nomi locale con un identificatore che non sarà mai usato, ed è meno "rumore" nel codice. Potenziale errore di compilazione del compilatore? –

+1

Penso che possa essere fonte di confusione perché il carattere di sottolineatura potrebbe anche essere percepito come "ignora/disabilita questo implicito del tutto". (Come in "import Predef. {Any2stringadd => _, _}'.) – Debilski

Problemi correlati