如何以编程方式检查变量是 val 还是 var?

How to check if a variable is val or var programmatically?

在scala中,我们可以这样定义变量: val a=10var a=10.

我们是否可以通过编程方式检查 a 是 val 还是 var

Scala 是一种面向对象的语言。这尤其意味着您只能操作对象。

Scala 中的变量不是对象(就像几乎所有编程语言一样),因此您无法调用变量上的方法来询问它是否是 varval (因为你只能调用对象上的方法,而变量不是对象),并且没有办法将变量传递给方法来询问方法变量是否是 valvar(因为您只能将对象作为参数传递,而变量不是对象)。

同样,这并不是 Scala 特有的,它适用于绝大多数编程语言。即使在像 Ruby 这样具有非常强大的动态元编程功能的编程语言中,变量也不是对象,无法反映。

但是等等,您可能会说,classes 也不是 Scala 中的对象,但我可以使用 scala.Predef.classof[T] 获得 class 的运行时表示!确实可以,但是 classes 和变量之间存在根本区别:classes 是 runtime 实体,因此即使它们不作为对象存在,它们 do 至少 exist 在运行时。变量是纯粹的编译时构造,它们在运行时不存在

所以,唯一的方法你可以得到一个变量是使用编译时反射。无论您想做什么,这很可能是完全矫枉过正。

所以,回答你的问题:

Is there anyway we can check if a is a val or var programmatically?

非常简短的回答:没有。

非常简短的回答:无论如何你都不应该使用var。如果你听从了那个建议,这个问题就没有实际意义了。

简答:如果您的局部变量作用域太大且令人费解,以至于您甚至无法确定变量是 var 还是 val 你有更大的问题。

简单回答:没有。

稍微详细一点的回答:不,不是在运行时。

非常复杂的答案:可能可以使用 Compile-Time Reflection