Scala:编译时常量

6
在Scala中如何声明编译时常量?与C#不同的是,如果在C#中声明:
const int myConst = 5 * 5;

myConst作为文字25进行内联处理。是否是:

final val myConst = 5 * 5

是否有等效的机制/语法,还是有其他机制/语法?
2个回答

10
是的,final val 是正确的语法,参考 Daniel's caveats,但是在Scala编程风格中,常量应该使用首字母大写的驼峰命名方式。
首字母大写很重要,如果您希望在模式匹配中使用常量。第一个字母是Scala编译器区分常量模式和变量模式的方法。请参阅Programming in Scala 第15.2节。
如果一个val或单例对象没有以大写字母开头,在将其用作匹配模式时,必须用反引号(``)将其括起来。
x match {
  case Something => // tries to match against a value named Something
  case `other` =>   // tries to match against a value named other
  case other =>     // binds match value to a variable named other
}

6
final val是完成此操作的方式。如果编译器可以,它将使其成为编译时常量。
详细了解“如果编译器可以”指的是什么,请读取下面的Daniel评论。

15
你忘记了两个重要点:它必须在编译时静态解析 - 我不确定 Scala 是否会在编译时进行文字算术运算 - 而且非常容易出错,它不能有类型。如果你声明为 final val myConst: Int = 5,它将不会被视为常数。 - Daniel C. Sobral
1
你有关于“它不能有类型”的参考资料吗? - ragazzojp
final修饰符必须存在,且不能给出类型注释。 - guymers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接