script - Buscando en la documentación de Scala para#::
script src chart js (5)
Bueno, normalmente, si vemos
foo bar baz
luego bar es un método, definido para foo, por lo que primero buscamos en la clase / objeto: definición de foo, luego el árbol de herencia / rasgo hacia arriba (+ en las conversiones implícitas hacia y desde foo, en el archivo actual, y en (directamente ) archivos incluidos).
Excepto ''barra'' termina en dos puntos, que es el caso aquí. Entonces hay que leerlo en orden inverso.
foo bar: baz
no es
foo.bar: (baz)
, pero
baz.bar: (foo)
Así que tenemos que mirar hacia arriba en la forma descrita anteriormente, pero no para foo, sino para baz.
Estoy tratando de encontrar la documentación para el método del operador Scala #::
. Creo que está definido en la clase Stream
debido a un example que encontré que lo usa.
Mi pregunta no es específica de este método (aunque me gustaría saber dónde están los documentos), pero cómo buscar los documentos de Scala en general. Intenté ingresar #::
en el cuadro de búsqueda en la esquina superior izquierda de la página de documentación (2.8.1), pero no encontré nada.
Como otros ya han mencionado, #::
está definido en scala.collection.immutable.Stream.ConsWrapper
. Solo quería tomarme un minuto para explicar por qué es eso.
En general, para llamar a un operador en un objeto, ese objeto debe existir. Sin embargo, la idea con un Stream es que la cola del stream no se evalúa hasta que necesita serlo. Así que considere la siguiente secuencia:
def fibs(a:Int,b:Int):Stream[Int] = a #:: fibs(b,a+b)
Por lo general, deberíamos evaluar la llamada recursiva de fibs
para poder llamar al operador #::
en ella. Esto llevaría a una recursión fuera de control. Esto NO es lo que queremos. Lo que queremos es que el receptor sea un Stream
nombre. De ahí el ConsWrapper
:
El constructor para ConsWrapper
es la class ConsWrapper[T](tail: => Stream[T])
tomando un Stream
nombre, y se crea a través de una conversión implícita Stream.consWrapper[T](stream: => Stream[T])
, que también lleva un nombre de Stream
.
Por lo tanto, hemos realizado una conversión implícita en el resultado de una función que aún no se ha llamado, y hemos imitado el efecto de llamar a #::
con un by-name this
referencia.
El problema aquí es que la búsqueda en scaladoc no le permite buscar una clase / objeto interno (es decir, cuyo padre no es un paquete). La declaración de #::
es Stream.#::
o Stream.ConsWrapper.#::
object Stream {
//STUFF
/** An extractor that allows to pattern match streams with `#::`.
*/
object #:: {
def unapply[A](xs: Stream[A]): Option[(A, Stream[A])] =
if (xs.isEmpty) None
else Some((xs.head, xs.tail))
}
class ConsWrapper[A](tl: => Stream[A]) {
def #::(hd: A): Stream[A] = new Stream.Cons(hd, tl)
def #:::(prefix: Stream[A]): Stream[A] = prefix append tl
}
//MORE STUFF
}
Puede solicitar esto como una RFE a la herramienta scaladoc en trac .
En el complemento de Scala de IntelliJ IDEA, podría haber utilizado la búsqueda de símbolos ( CTRL + ALT + MAYÚS + N ) y haber escrito #::
y esto habría activado ambas declaraciones de #::
inmediatamente.
Ese método en particular se define en una clase anidada dentro de Stream
, llamada scala.collection.immutable.Stream.ConsWrapper
.
Y no, no tengo la menor idea de cómo se trataría de encontrarlo. Solo lo encontré por accidente. Y a pesar de que sabía dónde encontrarlo ahora, cuando quería publicar el enlace a la clase aquí en mi respuesta, todavía no podía encontrarlo en el primer intento (e incluso el segundo y el tercero).
Sugiero usar el Índice de referencia : está diseñado específicamente para buscar cualquier tipo de símbolo (clase, rasgos, métodos, valores, vars) independientemente de su posición jerárquica, lo que contrasta con el índice izquierdo de Scaladoc que no muestra clases internas, rasgos o objetos.
Por desgracia, sólo está disponible en la noche. Puedes verlo todo en el Scaladoc nocturno . Observe el cuadro superior en el marco izquierdo, encima del índice.
Espero que sea incluido con Scala 2.9.0.
Editar A partir de 2.9.0, el índice de referencia comenzó a Scaladoc con Scaladoc . No hay necesidad de ir a los documentos nocturnos ahora.