16

请参阅 https://issues.scala-lang.org/browse/SI-5205https://github.com/scala/scala-dist/pull/20

前导 0 的八进制转义值已从 scala 中弃用,我没有看到惯用的替代方法。

你现在如何处理scala 2.10中的八进制?

编辑 - unix 权限是八进制的

4

3 回答 3

18

字面语法已经消失(或者我猜想)并且不太可能以任何形式回来,尽管0o700 已经提出了类似的替代方案。

如果您想要更像 2.10 中的编译时文字,您可以使用宏(这个特定的实现受 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

现在您无需为在运行时解析字符串付费,任何无效输入都会在编译时被捕获。

于 2013-05-16T15:14:37.987 回答
10

BigInt("21",8)如果你想解析八进制,你总是可以的。

于 2013-05-16T15:03:42.163 回答
2

这是从 Scala 2.11 开始的@Travis Brown 答案的更新版本

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.")
      }
    }""")
  }
}
于 2015-07-26T11:53:04.493 回答