19

Scala演算子メソッドのドキュメントを見つけようとしています#::。私が見つけたそれを使用するStreamのために、それはクラスで定義されていると思います。

私の質問はこの方法に特有のものではありませんが(ドキュメントがどこにあるか知りたいのですが)、Scalaドキュメントを一般的に検索する方法です。#::ドキュメントページ(2.8.1)の左上にある検索ボックスに入力しようとしましたが、何も見つかりませんでした。

4

5 に答える 5

18

リファレンス インデックスを使用することをお勧めします。これは、階層的な位置に関係なく、あらゆる種類のシンボル (クラス、トレイト、メソッド、val、var) を探すように特別に設計されています。内部クラス、トレイト、またはオブジェクト。

残念ながら、夜しか利用できません。毎晩の Scaladocですべてを見ることができます。左フレームのインデックスの上にある上部のボックスに注目してください。

Scala 2.9.0 にバンドルされることを願っています。

編集2.9.0 から、参照インデックスはScaladocにバンドルされ始めました。今は毎晩のドキュメントに行く必要はありません。

于 2010-12-29T12:42:38.393 に答える
12

他の人がすでに述べたように、#::で定義されていscala.collection.immutable.Stream.ConsWrapperます。その理由を詳しく説明したいと思います。

一般に、オブジェクトのオペレーターを呼び出すには、そのオブジェクトが存在している必要があります。ただし、ストリームの考え方は、ストリームの末尾は必要になるまで評価されないということです。したがって、次のストリームを検討してください。

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

通常、再帰呼び出しを評価して、その演算子をfibs呼び出すことができるようにする必要があります。#::これは暴走再帰につながります。これは私たちが望んでいるものではありません。私たちが望むのは、レシーバーが by-name であることStreamです。したがってConsWrapper

のコンストラクターConsWrapperclass ConsWrapper[T](tail: => Stream[T])by-nameを使用しており、これも by-name を使用Streamする暗黙の conversion によって作成されます。Stream.consWrapper[T](stream: => Stream[T])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
}

これを RFE としてtracの scaladoc ツールにリクエストできます。

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ます。

そして、いや、私はそれを見つけるためにどうやって行くのか全く分かりません。私は偶然にそれを偶然見つけただけです。そして、今どこにあるかはわかっていても、ここにあるクラスへのリンクを回答に投稿したいのですが、1回目(さらには2回目と3回目)の試行でも見つかりませんでした

于 2010-12-29T12:28:24.143 に答える