Как определить тип переменной, если она не задана?

Предположим, у нас есть что-то вроде:

val x = "foo".charAt(0)

и предположим далее, что мы не знаем тип возврата метода charAt(0) (что, конечно же, описано в API Scala). Есть ли способ, мы можем узнать, какой тип переменной x имеет после его определения и когда он не объявлен явно?

обновление 1: Мой первоначальный вопрос был недостаточно точным: я хотел бы знать (по причинам отладки), какой тип имеет переменная. Может быть, есть какой-то вариант компилятора, чтобы увидеть, какой тип переменной объявляется выводом типа Scala ?

4 ответов


Предположим, у вас есть следующее В исходном файле с именем 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

ваш IDE может также обеспечить более приятный способ, чтобы получить эту информацию, как Луиджи "Плинж" отмечает в комментарии выше.


вот более простая версия первой альтернативы Трэвиса:

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

использовать этот метод для задачи:

x.getClass

если вы используете IntelliJIDEA, чтобы показать действие типа Info в Редакторе, перейдите к значению и нажмите Alt + = для Windows и Ctrl + Shift + P для Mac:

enter image description here

Я считаю, это очень удобно при написании кода.