por ejemplo, necesito acceder al manifiesto en la función def a[A:ClassManifest]
para obtener la clase de borrado. Puedo usar la función Predef.implicitly pero en ese caso mi código será tan largo como si utilizo el formulario completo def a[A](implicit b:ClassManifest[A])
. Entonces, ¿hay nombres generados convenientes para esos argumentos implícitos?¿Cómo puedo acceder a "implícito" implícito, es decir, def a [A: B] o def a [A <% B]?
Respuesta
Hay tres métodos predefinidos en Predef
que lo hará por Manifest
s, ClassManifest
s y OptManifest
s: manifest[T]
, classManifest[T]
y optManifest[T]
, respectivamente. Puede escribir sus propios "captadores implícitos" para otras clases de tipos de acuerdo con el mismo patrón. Aquí es por ejemplo manifest[T]
:
def manifest[T](implicit m: Manifest[T]) = m
Así que aquí está cómo se podría escribir su propia:
trait UsefulTypeclass[A] {
def info = 42 // sample method
}
// the “implicit getter”
def usefulTypeclass[A](implicit tc: UsefulTypeclass[A]) = tc
// a method that uses the implicit getter
def foo[A: UsefulTypeclass] =
usefulTypeclass[A].info
Como un buen truco: si nombra el getter implícito "apply" y lo coloca en el objeto complementario de UsefulTypeclass, puede usar "UsefulTypeclass [T]" como un valor que representa la instancia de la clase de tipo para T sin tener que importar nada más que la clase de tipo en sí. –
@RM Buen truco. Supongo que tendría que ser 'UsefulTypeclass [T]()' (con el extra '()') entonces. –
En realidad, no necesita los parens. Si tiene (perdone la falta de formato) el objeto TC {def apply [T] (implícita x: TC [T]) = x} puede invocarlo literalmente con solo "TC [SomeClass]" porque se está definiendo "apply" como un método sin parámetros con una lista de parámetros implícita, y [SomeClass] lo desambigua de solo una referencia al objeto TC. Desagea a TC.aplicar [SomeClass] (theIlicitValue) –
scalap al rescate!
Tomé este código:
object TestThing extends App {
def one { println("one") }
def two[T] { println("two") }
def three[T : Manifest] { println("three") }
def four[T: Manifest, U : Manifest] { println("four") }
}
y se lo pasó por scalap. Aquí es lo que tengo:
object TestThing extends java.lang.Object with scala.App with scala.ScalaObject {
def this() = { /* compiled code */ }
def one : scala.Unit = { /* compiled code */ }
def two[T] : scala.Unit = { /* compiled code */ }
def three[T](implicit evidence$1 : scala.Predef.Manifest[T]) : scala.Unit = { /* compiled code */ }
def four[T, U](implicit evidence$2 : scala.Predef.Manifest[T], evidence$3 : scala.Predef.Manifest[U]) : scala.Unit = { /* compiled code */ }
}
Como se puede ver, el primer Manifiesto implícita se llama evidence$1
. ¡El segundo y tercero: aunque en un alcance diferente! -se llaman evidence$2
y evidence$3
. Entonces ... así es como haces referencia a Manifiestos.
A pesar de eso, me parece un poco aterrador que eliminar un Manifiesto que está más arriba en la clase cambie el nombre de un Manifiesto que se encuentra más abajo en el archivo. Del mismo modo, tampoco ayuda que el complemento de sintaxis del complemento IntelliJ Scala parezca pensar que las variables de Manifiesto en el alcance en four()
son evidence$1
y evidence$2
, y no cree que evidence$3
sea una variable válida allí (aunque sí lo es, y evidence$1
no). En general, tal vez estas cosas deberían ser consideradas como señales de advertencia sobre jugar con variables de Manifiesto implícitas.
- 1. Tipo parámetro de minBy [B] (f: ((A, B)) ⇒ B) (cmp implícita: Orden [B]): (A, B)
- 2. ¿Por qué (a | b) es equivalente a a - (a & b) + b?
- 3. ¿Cómo [b] [b = a, 0] intercambia entre a y b?
- 4. Cómo convertir A [B [C]] a B [A [C]] si A y B son mónadas?
- 5. ¿Math.max (a, b) o (a> b)? A: b son más rápidos en Java?
- 6. La manera más fácil de convertir "a/b/c" a ["a/b/c", "a/b", "a"]
- 7. División de enteros: ¿es a // b == int (a/b) verdadero para todos los enteros a, b?
- 8. Rangos A a B donde A> B en F #
- 9. ¿Cuál es la diferencia entre a [:] = b y a = b [:]
- 10. a == b es falso, pero id (a) == id (b) es verdadero?
- 11. ¿Por qué funciona "a + + b", pero "a ++ b" no?
- 12. ¿Cuál es la diferencia entre a + = b y a = + b, también a ++ y ++ a?
- 13. Shell: ¿"a -lt b" no significa verdadero si a es menor que b?
- 14. Nombre del tipo de patrón: R a b = Q (a -> (R a b, b))
- 15. Rubí pregunta sintaxis: racional (a, b) y Rational.new (a, b)
- 16. Functor es para (a -> b) -> (f a -> f b), ¿qué es para (Categoría c) => c a b -> c (f a) (f b)?
- 17. Rieles 3: ¿Cómo validar que A <B donde A y B son atributos del modelo?
- 18. Diferencia entre a [:] = b y a = b [:]? (Python)
- 19. Diferencia entre un +++++ b y A ++ + ++ b
- 20. ¿Cuál es la diferencia entre double a = a + int b e int a + = double b?
- 21. ¿Qué significa "rasgo A <: B"?
- 22. Cálculo (a^b)% MOD
- 23. ¿Debo definir el índice (A) y el índice (B), o el índice (A, B) o ambos?
- 24. Estructura de datos de mapeo uno-a-uno (A, B) con getKey (B) en O (1)?
- 25. char * a, * b; ¿Qué tipo es (b-a) y cómo lo imprimo?
- 26. A o B, no ambos, ninguno tampoco
- 27. Lógica: is (A &&! (B || C)) || (B || C) lo mismo que (A || B || C)?
- 28. Por qué Numpy trata a + = b y a = a + b de manera diferente
- 29. pitón: (? X a: b) iif o
- 30. Partido solamente A o caso B insensibles
Siempre puede declarar un método con un nombre más pequeño, pero _no_ debería depender de los nombres mágicos generados por Scalac. –