3

Squerylの開始ページには、Scala コードのサンプルがあります。

import sbt._

class Project(info: ProjectInfo) extends DefaultProject(info) {

   val squeryl = "org.squeryl" % "squeryl_2.8.1" % "0.9.4-RC3"
}

% は RichString または String クラスで定義されたメソッドではないため、私は困惑しています。私の最善の推測は、それが別の場所で定義されており、暗黙の変換として呼び出されているということです。

Scala でそのようなコードを読んで理解するための最良の方法は何でしょうか?

4

3 に答える 3

5

import sbt._fromまたは from からのみ取得できDefaultProjectます。はパッケージ オブジェクトではないためsbt、 から取得する必要がありますDefaultProject

これは、インプリシットをスコープに定義またはインポートする必要objectがあり、オブジェクト (オブジェクトまたはクラスのインスタンス)からのみインポートできるためです。例外は、ソースまたはターゲット (既知の場合) 型のコンパニオン オブジェクトで定義された暗黙的であり、既に確認したようにどちらも適用されません。

しかし、それは少しばかげています。新しい Scaladoc が作成された理由は、まさにこのような問題を処理するためです。

たとえば、Scala パーサーを考えてみましょう。

import scala.util.parsing.combinator.JavaTokenParsers
object T extends JavaTokenParsers {
    def myparser = "\\w+".r ~ "\\d+".r
}

メソッド~は で定義されていないRegexため、検索します。ここで最新の scaladoc をチェックして、以下の説明を試してください。

#最も簡単な方法:左上隅にある をクリックして、記号で始まるメソッドのリストを取得します。下にスクロールして~、BigInt OnceParser パーサー パーサーを参照してください。ここから先は試行錯誤と勘で。

整然とした方法:JavaTokenParsers検索ボックスに入力してクラスをすばやく見つけ、選択します。メソッドのリストで、implicitfromRegexから何か他のものを見つけます。にかかるのは 1 つだけParserです。をクリックしParserて確認します。

変換を行うメソッドをクリックしてimplicit def regex、定義されている場所を確認することをお勧めしますRegexParsersJavaTokenParsersそのクラスで定義またはオーバーライドされていない場合でも、そのメソッドの定義を示すドキュメント。

これは特に重要です。SBT API ドキュメンテーションを で確認DefaultProjectすると、メソッド自体が定義されておらず、40 (正しく数えた場合) 祖先のトレイトとメソッドの名前のみを提供しているという事実に出くわすからです。クラス。をクリックして からと の両方への暗黙ManagedProject的な変換があることを確認するには、しばらく時間がかかる場合があります。前者は と を定義し、後者は を定義します。StringGroupIDRepositoryName%%%at

于 2011-01-20T20:49:03.503 に答える
3

IntelliJ の Scala プラグインは通常それらを見つけることができるので、^b を使用してすぐに移動できます。それを超えて、インポートしたものから始めて、ドキュメントを検索します。

于 2011-01-20T13:48:34.463 に答える
1

暗黙の変換ですね!

すべての Implicit と同様に、コア ライブラリで事前定義されていない場合、探し始めるのに最適な場所はインポートとスーパークラスです。

与えられた例では、これは明らかに SBT のものであるため、Google コードですばやく検索して見つけることができます。

于 2011-01-20T14:29:00.187 に答える