【问题标题】:Searching the Scala documentation for #::在 Scala 文档中搜索#::
【发布时间】:2011-06-01 00:49:04
【问题描述】:

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

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

【问题讨论】:

    标签: scala search scaladoc


    【解决方案1】:

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

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

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

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

    【讨论】:

    • @pedrofurla 我唯一能提出的建议是,他们也开始在稳定文档中使用相同的功能(从侧边栏顶部选择的字母表)。
    • @pedrofurla:对 vscaladoc 的一些可能的改进:1) 在侧边栏中显示内部类。 2) 在每个类中,根据隐式转换添加一个可以像类成员一样调用的方法列表。请务必说明获取该方法所需的类或转换,并确保它能够检测到 ConsWrapper 转换,这有点不寻常,因为它是按名称转换。
    • @pedrofurla:我认为 vscaladoc 是您这些天用来生成标准库文档的工具。不管怎样——标准库文档应该有这些特性。
    • @Ken,检查我的答案中提供的链接是否。 1. 没有。 2,这是一个很难实现的目标,但非常有用。
    • @pedrofurla:我在侧边栏中没有看到Predef.<:<
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      这里的问题是 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
      }
      

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

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

      【讨论】:

      • 除非Stream.#::是错误的。 OP正在询问Stream.ConsWrapper.#::
      • 正确 - 但答案仍然有效
      • 谢谢。实际上,我不确定哪个(Stream.#::Stream.ConsWrapper.#::)正在执行。我需要研究代码。
      • @Ralph: Stream.#:: 是一个用于模式匹配的对象。这不是所谓的。正如我在回答中解释的那样,您正在致电Stream.ConsWrapper.#::
      【解决方案4】:

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

      foo bar baz 
      

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

      除了 'bar' 以冒号结尾,这里就是这种情况。然后是倒序阅读——

      foo bar: baz 
      

      不是

      foo.bar: (baz)
      

      ,但是

      baz.bar: (foo) 
      

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-01
          • 2017-01-13
          • 2017-07-11
          • 2011-11-04
          • 2015-06-27
          • 1970-01-01
          • 2021-03-26
          • 1970-01-01
          相关资源
          最近更新 更多