在Scala文档中搜索#::

Ral*_*lph 19 search scala scaladoc

我试图找到Scala运算符方法的文档#::.我相信它是在Stream类中定义的,因为我发现使用它的一个例子.

我的问题并不特别针对这种方法(虽然我想知道文档的位置),但是如何一般地搜索Scala文档.我尝试进入#::文档页面左上角的搜索框(2.8.1),但没有找到任何内容.

ped*_*rla 18

我建议使用参考索引 - 它专门设计用于寻找任何类型的符号(类,特征,方法,vals,vars),而不管它的层次结构位置 - 与Scaladoc的左侧索引形成对比,该索引不显示内部类,特征或对象.

不幸的是,它只在夜间使用.你可以在夜间Scaladoc看到整个事情.注意左侧框架中的上方框,位于索引上方.

希望它与Scala 2.9.0捆绑在一起.

编辑自2.9.0开始,参考索引开始与Scaladoc捆绑在一起.现在不需要去夜间文档了.


Ken*_*oom 12

正如其他人已经提到的,#::定义于scala.collection.immutable.Stream.ConsWrapper.我只是想花点时间详细说明为什么会这样.

通常,要在对象上调用操作符,该对象需要存在.但是,使用Stream的想法是流的尾部直到需要时才进行评估.请考虑以下流:

def fibs(a:Int,b:Int):Stream[Int] = a #:: fibs(b,a+b)
Run Code Online (Sandbox Code Playgroud)

通常,我们需要评估递归fibs调用,以便我们可以调用#::它的运算符.这将导致失控的递归.这不是我们想要的.我们想要的是接收者是一个名字Stream.因此ConsWrapper:

构造函数ConsWrapperclass ConsWrapper[T](tail: => Stream[T])一个带名字的Stream,它是通过隐式转换创建的Stream.consWrapper[T](stream: => Stream[T]),它也采用了一个名字Stream.

因此,我们对尚未调用的函数的结果执行了隐式转换,并且我们模仿了#::使用by-name this引用调用的效果.


oxb*_*kes 5

这里的问题是scaladoc搜索不允许您查找内部类/对象(即其父级不是包).声明#::Stream.#::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
}
Run Code Online (Sandbox Code Playgroud)

您可以将此请求作为trac中 scaladoc工具的RFE .

在IntelliJ IDEA的scala插件中,您可以使用符号查找(CTRL+ ALT+ SHIFT+ N)和键入#::,这将#::立即启动两个声明.