假设,我们有这样的:如何在未给定变量时确定变量的类型?
val x = "foo".charAt(0)
,让我们进一步假设,我们不知道的方法charAt(0)
的返回类型(是的,当然,Scala的API中所描述的)。有没有办法,我们可以发现,哪种类型的变量x
在其定义之后以及何时未明确声明?
更新1: 我最初的问题是不够精确:我想知道(因为调试)中的变量是什么类型。也许有一些编译器选项可以查看Scala类型推断所声明的变量类型?
假设,我们有这样的:如何在未给定变量时确定变量的类型?
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
}
}
你也可以在REPL使用:type
:
scala> :type "foo".charAt(0)
Char
scala> :type "foo".charAt _
Int => Char
你的IDE还可以提供一个更好的方式来获得这些信息,如路易吉Plinge在评论指出上面。
非常完美,非常感谢,这帮了我很多(两个变种)! –
使用此方法的问题:
x.getClass
这里的特拉维斯第一替代方案的一个更简单的版本:
[email protected]:~/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();
()
}
}
}
}
}
谢谢Daniel提供更多信息。您使用Scala选项,我可以在哪里阅读有关所有Scala选项的内容?我只能找到Scala编译器的手册页,而不是解释器。 –
查看编译器等支持的命令行的最简单方法。 'scala -help'或'scalac -help'来查看“normal”选项,然后'scalac -X'查看“advanced”选项,'scalac -Y'查看“private”选项。 –
@PaulButcher谢谢! –
没有一些额外的信息就很难回答这个问题。 “确定类型”是什么意思?在编译时使用它做什么?在运行时?你需要_type_,还是'java.lang.Class'足够好?你可以使用Scala 2.10吗? –
这种“typeof”的东西通常表示你的代码通常很痛苦,你应该构造你的代码,以便多态性自然地处理这个问题。 –
@TravisBrown你是对的,我的问题不够精确。我想知道(出于调试原因)变量有什么类型。也许有一些编译器选项可以查看Scala类型推断所声明的变量类型? –