2012-08-23 8 views
7

Tengo un método que llama a algunos otros métodos que hacen uso de un implícito de tipo Foo. Me gustaría poner f implícito dentro de Foo. Así es como lo hago:Marcado de un argumento implícito dentro de un método

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

no quiero para marcar f implícita en la firma de myMethod desde Foos no están implícitos en el contexto que se está utilizando myMethod. Mi pregunta: ¿hay una manera más idiomática (o concisa) para lograr este efecto que usar una variable temporal?

+2

En este sencillo ejemplo, probablemente sea más fácil pasar 'f' explícitamente que utilizar implícitos, pero supongo que su código real es lo suficientemente complejo para que lo implícito valga la pena. En ese caso, creo que su solución de declarar un 'valor implícito' dentro del método es la mejor manera de hacerlo si desea evitar declarar el parámetro como implícito en la firma del método. – DaoWen

+0

@DaoWen Realmente debería enviar su comentario como respuesta. –

+0

@ Aaron Novstrup - Sí, mirando las otras respuestas que probablemente debería tener. Todavía soy bastante nuevo aquí, por lo que todavía me cuesta decidir qué cae en la categoría de respuesta vs comentario. – DaoWen

Respuesta

4

Puede pasar explícitamente parámetros implícitos, por lo que, aunque no haya Foo en el alcance implícito de la persona que llama, la persona que llama puede pasarlo explícitamente.

Como se ha comentado, se puede utilizar este mismo truco para pasar el Foo a somethingThatNeedsFoo:

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

nunca he visto esta siendo utilizado en realidad pero se puede evitar la unión de la variable a un nombre. Usando, por supuesto, el guión bajo:

implicit val _ = f 

No recomendaría este uso.

+0

¿Cuál es el motivo para desaconsejar este uso? Me gusta que evite contaminar el espacio de nombres local con un identificador que nunca se utilizará, y que sea menos "ruidoso" en el código. Posibilidad de confundir los errores del compilador? –

+1

Creo que puede ser confuso porque el guión bajo también se puede percibir como 'ignorar/deshabilitar todo esto implícitamente'. (Como en 'importación Predef. {Any2stringadd => _, _}'.) – Debilski

Cuestiones relacionadas