【问题标题】:How can I determine the type of a variable when it is not given?未给出变量时如何确定变量的类型?
【发布时间】:2016-11-06 04:44:15
【问题描述】:

假设,我们有类似的东西:

val x = "foo".charAt(0)

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

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

【问题讨论】:

  • 如果没有一些额外的信息,将很难回答这个问题。 “确定类型”是什么意思?在编译时用它做点什么?在运行时?您需要 type,还是 java.lang.Class 足够好?你能用 Scala 2.10 吗?
  • 这种“typeof”的东西通常表明你的代码很糟糕,你应该构造你的代码,让多态性自然地处理这个..
  • @TravisBrown 你说得对,我的问题不够精确。我想知道(出于调试原因)变量的类型。也许有一些编译器选项可以查看 Scala 的类型推断将变量声明为什么类型?
  • 我只需将鼠标悬停在它上面,然后在您选择的 IDE 中按 Ctrl 键
  • @LuigiPlinge 谢谢你的提示。

标签: scala types


【解决方案1】:

假设您在名为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

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

【讨论】:

  • 完美,非常感谢,这对我帮助很大(两种变体)!
【解决方案2】:

这是 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();
          ()
        }
      }
    }
  }
}

【讨论】:

  • 感谢 Daniel 提供更多信息。您使用 Scala 选项,我在哪里可以阅读有关所有 Scala 选项的信息?我只能找到 Scala 编译器的手册页,而不是解释器的手册页。
  • 从命令行查看编译器等支持的最简单方法。 scala -helpscalac -help 可查看“普通”选项,scalac -X 可查看“高级”选项,scalac -Y 可查看“私人”选项。
【解决方案3】:

使用此方法解决问题:

x.getClass

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 2011-12-06
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2016-02-29
      相关资源
      最近更新 更多