假设,我们有类似的东西:
val x = "foo".charAt(0)
让我们进一步假设,我们不知道方法的返回类型charAt(0)
(当然,这是在 Scala API 中描述的)。有没有办法,我们可以找出该变量x
在定义后具有哪种类型以及何时未显式声明?
更新 1: 我最初的问题不够精确:我想知道(出于调试原因)变量的类型。也许有一些编译器选项可以查看 Scala 的类型推断将变量声明为什么类型?
假设您在名为 的源文件中有以下内容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 还可能提供更好的方式来获取此信息。
使用此方法解决问题:
x.getClass
这是 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();
()
}
}
}
}
}
如果您使用IntelliJIDEA,要在编辑器中显示类型信息操作,请导航到该值并按Alt
+ =
(对于 Windows)和Ctrl
+ Shift
+ P
(对于 Mac):
在编写代码时,我发现它非常方便。