看到
https://issues.scala-lang.org/browse/SI-5205
和
https://github.com/scala/scala-dist/pull/20
scala已弃用了以0开头的八进制转义值,我看不到惯用的替代方法。
您现在如何在scala 2.10中处理八进制?
编辑-Unix权限为八进制
最佳答案
字面语法已消失(或可能会消失),并且不太可能以任何形式返回,尽管诸如0o700
have been proposed之类的替代方法也是如此。
如果您想要更像2.10中的编译时文字,可以使用宏(此特定实现为inspired by Macrocosm):
import scala.language.experimental.macros
import scala.reflect.macros.Context
object OctalLiterals {
implicit class OctallerContext(sc: StringContext) {
def o(): Int = macro oImpl
}
def oImpl(c: Context)(): c.Expr[Int] = {
import c.universe._
c.literal(c.prefix.tree match {
case Apply(_, Apply(_, Literal(Constant(oct: String)) :: Nil) :: Nil) =>
Integer.decode("0" + oct)
case _ => c.abort(c.enclosingPosition, "Invalid octal literal.")
})
}
}
然后,您可以编写以下内容:
scala> import OctalLiterals._
import OctalLiterals._
scala> o"700"
res0: Int = 448
现在,您无需为在运行时解析字符串付费,并且在编译时会捕获任何无效的输入。