6

次のようなものがあるとします。

val x = "foo".charAt(0)

さらに、メソッドの戻り値の型がわからないcharAt(0)(もちろん、Scala API で説明されています) と仮定しましょう。x変数が定義後、明示的に宣言されていないときにどの型を持っているかを知る方法はありますか?

更新 1: 私の最初の質問は十分に正確ではありませんでした: (デバッグの理由で) 変数の型を知りたいです。Scala の型推論によって宣言された変数の型を確認するためのコンパイラ オプションがあるのではないでしょうか。

4

4 に答える 4

7

という名前のソース ファイルに次のものがあるとしますSomething.scala

object Something {
  val x = "foo".charAt(0)
}

コンパイラ フラグを使用して-Xprint:typer、コンパイラのtyperフェーズの後にプログラムを確認できます。

$ scalac -Xprint:typer Something.scala
[[syntax trees at end of typer]]// Scala source: Something.scala
package <empty> {
  final object Something extends java.lang.Object with ScalaObject {
    def this(): object Something = {
      Something.super.this();
      ()
    };
    private[this] val x: Char = "foo".charAt(0);
    <stable> <accessor> def x: Char = Something.this.x
  }
}

:typeREPL で使用することもできます。

scala> :type "foo".charAt(0)
Char

scala> :type "foo".charAt _
Int => Char

上記のコメントで Luigi Plinge が指摘しているように、IDE もこの情報を取得するためのより良い方法を提供する場合があります。

于 2012-07-01T20:12:21.283 に答える
3

Travisの最初の代替案のより簡単なバージョンは次のとおりです。

dcs@dcs-132-CK-NF79:~/tmp$ scala -Xprint:typer -e '"foo".charAt(0)'
[[syntax trees at end of                     typer]] // scalacmd8174377981814677527.scala
package <empty> {
  object Main extends scala.AnyRef {
    def <init>(): Main.type = {
      Main.super.<init>();
      ()
    };
    def main(argv: Array[String]): Unit = {
      val args: Array[String] = argv;
      {
        final class $anon extends scala.AnyRef {
          def <init>(): anonymous class $anon = {
            $anon.super.<init>();
            ()
          };
          "foo".charAt(0)
        };
        {
          new $anon();
          ()
        }
      }
    }
  }
}
于 2012-07-01T21:29:25.690 に答える
3

問題には次の方法を使用します。

x.getClass
于 2012-07-01T19:46:03.447 に答える
2

IntelliJIDEAを使用している場合、エディターで Type Info アクションを表示するには、値に移動し、Windowsの場合は+を、Macの場合は+ Alt+を押します。=CtrlShiftP

ここに画像の説明を入力

コードを書くときにとても便利だと思います。

于 2016-11-05T20:44:15.973 に答える