2012-07-01 137 views
6

假设,我们有这样的:如何在未给定变量时确定变量的类型?

val x = "foo".charAt(0) 

,让我们进一步假设,我们不知道的方法charAt(0)的返回类型(是的,当然,Scala的API中所描述的)。有没有办法,我们可以发现,哪种类型的变量x在其定义之后以及何时未明确声明?

更新1: 我最初的问题是不够精确:我想知道(因为调试)中的变量是什么类型。也许有一些编译器选项可以查看Scala类型推断所声明的变量类型?

+1

没有一些额外的信息就很难回答这个问题。 “确定类型”是什么意思?在编译时使用它做什么?在运行时?你需要_type_,还是'java.lang.Class'足够好?你可以使用Scala 2.10吗? –

+0

这种“typeof”的东西通常表示你的代码通常很痛苦,你应该构造你的代码,以便多态性自然地处理这个问题。 –

+0

@TravisBrown你是对的,我的问题不够精确。我想知道(出于调试原因)变量有什么类型。也许有一些编译器选项可以查看Scala类型推断所声明的变量类型? –

回答

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

你也可以在REPL使用:type

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

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

你的IDE还可以提供一个更好的方式来获得这些信息,如路易吉Plinge在评论指出上面。

+0

非常完美,非常感谢,这帮了我很多(两个变种)! –

3

使用此方法的问题:

x.getClass 
3

这里的特拉维斯第一替代方案的一个更简单的版本:

[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(); 
     () 
     } 
     } 
    } 
    } 
} 
+0

谢谢Daniel提供更多信息。您使用Scala选项,我可以在哪里阅读有关所有Scala选项的内容?我只能找到Scala编译器的手册页,而不是解释器。 –

+1

查看编译器等支持的命令行的最简单方法。 'scala -help'或'scalac -help'来查看“normal”选项,然后'scalac -X'查看“advanced”选项,'scalac -Y'查看“private”选项。 –

+0

@PaulButcher谢谢! –

1

如果使用IntelliJIDEA,显示在编辑器中键入信息的行动,导航到值并按Alt + =用于Windows和Ctrl + Shift + P为Mac:

enter image description here

我觉得很方便的编写代码的时候。