在Scala文档中搜索#::

时间:2010-12-29 12:03:16

标签: scala search scaladoc

我正在尝试查找Scala运算符方法#::的文档。我相信它是在Stream类中定义的,因为我发现使用它example

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

5 个答案:

答案 0 :(得分:18)

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

不幸的是,它只在夜间使用。你可以在nightly Scaladoc看到整件事。注意左框中的上方框,位于索引上方。

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

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

答案 1 :(得分:12)

正如其他人已经提到的那样,#::定义在scala.collection.immutable.Stream.ConsWrapper。我只想花点时间详细说明原因。

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

def fibs(a:Int,b:Int):Stream[Int] = a #:: fibs(b,a+b)

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

ConsWrapper的构造函数class ConsWrapper[T](tail: => Stream[T])采用名字Stream,它是通过隐式转换Stream.consWrapper[T](stream: => Stream[T])创建的,它还带有一个名字{{} 1}}。

因此,我们对尚未调用的函数的结果执行了隐式转换,并且我们模仿了使用名称Stream引用调用#::的效果。< / p>

答案 2 :(得分: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
}

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

在IntelliJ IDEA的scala插件中,您可以使用符号查找 CTRL + ALT + SHIFT + N )并键入#::,这会立即提出#::的两个声明。

答案 3 :(得分:2)

嗯,通常,如果我们看到

foo bar baz 

然后bar是一个为foo定义的方法,所以我们首先查看类/对象 - foo的定义,然后是继承/特征树向上(在当前文件中与foo进行隐式转换时的+,以及在(直接)包含的文件中)。

除了'bar'以冒号结尾,这就是这里的情况。然后以相反的顺序阅读 -

foo bar: baz 

不是

foo.bar: (baz)

,但是

baz.bar: (foo) 

所以我们必须按照上面描述的方式查找,但不是为了foo,而是为了baz。

答案 4 :(得分:1)

该特定方法在Stream内的嵌套类中定义,称为scala.collection.immutable.Stream.ConsWrapper

不,我完全不知道如何找到它。我偶然偶然发现了它。即使我知道现在在哪里找到它,当我想在我的答案中发布这个类的链接时,我仍然在第一个找不到它(甚至第二和第三)尝试。