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
  }
}

你也可以:type在 REPL 中使用:

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

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

正如 Luigi Plinge 在上面的评论中指出的那样,您的 IDE 还可能提供更好的方式来获取此信息。

于 2012-07-01T20:12:21.283 回答
3

使用此方法解决问题:

x.getClass
于 2012-07-01T19:46:03.447 回答
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 回答
2

如果您使用IntelliJIDEA,要在编辑器中显示类型信息操作,请导航到该值并按Alt+ =(对于 Windows)和Ctrl+ Shift+ P(对于 Mac):

在此处输入图像描述

在编写代码时,我发现它非常方便。

于 2016-11-05T20:44:15.973 回答