Как определить тип переменной, если она не задана?
Предположим, у нас есть что-то вроде:
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();
()
}
}
}
}
}
если вы используете IntelliJIDEA, чтобы показать действие типа Info в Редакторе, перейдите к значению и нажмите Alt
+ =
для Windows и Ctrl
+ Shift
+ P
для Mac:
Я считаю, это очень удобно при написании кода.