19

我正在尝试查找 Scala operator method 的文档#::。我相信它是在Stream课堂上定义的,因为我发现一个使用它的例子。

我的问题不是针对这种方法(尽管我想知道文档在哪里),而是如何搜索一般的 Scala 文档。我尝试#::在文档页面(2.8.1)左上角的搜索框中输入,但一无所获。

4

5 回答 5

18

我建议使用参考索引——它专门设计用于查找任何类型的符号(类、特征、方法、vals、vars),而不管它的层次位置如何——与不显示内部类、特征或对象。

不幸的是,它只在夜间可用。你可以在每晚的 Scaladoc中看到全部内容。注意左框架中的上框,在索引上方。

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

编辑从 2.9.0 开始,参考索引开始与Scaladoc捆绑在一起。现在不需要去看每晚的文档。

于 2010-12-29T12:42:38.393 回答
12

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

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

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

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

for 的构造函数ConsWrapper采用class ConsWrapper[T](tail: => Stream[T])by-name Stream,它是通过隐式转换创建的Stream.consWrapper[T](stream: => Stream[T]),它也采用 by-name Stream

因此,我们对尚未调用的函数的结果执行了隐式转换,并模仿了#::使用按名称this引用进行调用的效果。

于 2010-12-29T16:30:45.237 回答
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) 并键入#::,这会#::立即提出两个声明。

于 2010-12-29T12:21:02.390 回答
2

好吧,通常情况下,如果我们看到

foo bar baz 

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

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

foo bar: baz 

不是

foo.bar: (baz)

, 但

baz.bar: (foo) 

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

于 2010-12-30T02:39:44.290 回答
1

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

不,我完全不知道如何找到它。我只是偶然偶然发现了它。即使我现在知道在哪里可以找到它,但当我想在我的答案中发布指向该课程的链接时,我仍然无法在第一次(甚至第二次和第三次)尝试中找到它。

于 2010-12-29T12:28:24.143 回答