Как проверить, является ли переменная val или var программно? - PullRequest
0 голосов
/ 28 марта 2020

В scala мы можем определить переменную следующим образом: val a=10 или var a=10.

Есть ли в любом случае, мы можем проверить, является ли a val или var программно?

1 Ответ

7 голосов
/ 28 марта 2020

Scala - объектно-ориентированный язык. В частности, это означает, что вы можете манипулировать только объектами.

Переменные не являются объектами в Scala (как почти во всех языках программирования), поэтому нет способа, например, вызвать метод для переменной, чтобы спросить его, является ли это var или val (потому что вы можете вызывать методы только для объектов, а переменные не являются объектами), и нет способа передать переменную в метод спросите метод, является ли переменная val или var (потому что вы можете передавать объекты только как аргументы, а переменные не являются объектами).

Опять же, это не совсем определено c до Scala, это относится к подавляющему большинству языков программирования. Даже в таких языках программирования, как Ruby с очень мощными динамическими возможностями мета-программирования c, переменные не являются объектами и не могут быть отражены.

Но подождите, как вы могли бы сказать, классы не являются объектами в Scala, но я могу получить представление класса во время выполнения, используя scala.Predef.classof[T]! Конечно, вы можете, но есть фундаментальное различие между классами и переменными: классы являются исполняемыми сущностями, поэтому даже если они не существуют как объекты, они делают по крайней мере существует во время выполнения. Переменные являются чистой конструкцией времени компиляции, они не существуют во время выполнения.

Итак, единственный способ , который вы можете получить для переменной вообще использует отражение во время компиляции . Что, вполне вероятно, является полным излишним для того, что вы хотите сделать.

Итак, чтобы ответить на ваш вопрос:

Есть ли в любом случае, мы можем проверить, является ли a val или var программно?

Очень короткий ответ : Нет.

Очень короткий ответ : Вы не должны все равно используйте var. Если вы последуете этому совету, вопрос станет спорным.

Краткий ответ : Если ваши области видимости локальной переменной настолько велики и запутаны, что вы даже не можете понять, является ли переменная var или val у вас гораздо большие проблемы.

Простой ответ : Нет.

Чуть более сложный ответ : Нет, не во время выполнения .

Очень сложный ответ : Вероятно, возможно использовать Отражение во время компиляции .

...