请参考https://issues.scala-lang.org/browse/SI-5205和https://github.com/scala/scala-dist/pull/20
在Scala中,前导0的八进制转义值已被弃用,我没有看到一个惯用的替代方法。
现在你如何处理Scala 2.10中的八进制呢?
编辑 - Unix权限是八进制
请参考https://issues.scala-lang.org/browse/SI-5205和https://github.com/scala/scala-dist/pull/20
在Scala中,前导0的八进制转义值已被弃用,我没有看到一个惯用的替代方法。
现在你如何处理Scala 2.10中的八进制呢?
编辑 - Unix权限是八进制
字面量语法已经消失(或正在消失),不太可能以任何形式回来,尽管已经提出了类似 0o700
的替代方案,如此提议。
如果你想要更像 2.10 中的编译时字面量,你可以使用宏(这个特定的实现是受 Macrocosm 启发的: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
现在您不需要在运行时解析字符串,任何无效的输入在编译时即可被捕获。
如果你想解析八进制,你可以始终使用 BigInt("21",8)
。
以下是Travis Brown先生的答案的更新版本,适用于Scala 2.11
import scala.reflect.macros.blackbox
import scala.language.experimental.macros
object OctalLiterals {
implicit class OctallerContext(sc: StringContext) {
def o(): Int = macro oImpl
}
def oImpl(c: blackbox.Context)(): c.Expr[Int] = {
import c.universe._
c.Expr(q"""${
c.prefix.tree match {
case Apply(_, Apply(_, Literal(Constant(oct: String)) :: Nil) :: Nil) ⇒
Integer.decode("0" + oct).toInt
case _ ⇒ c.abort(c.enclosingPosition, "Invalid octal literal.")
}
}""")
}
}
021 == 17
这样的奇怪事实所困扰过。 - Travis Brown