Scala 2.10 - 八进制转义已被弃用 - 现在如何惯用八进制?

Posted

技术标签:

【中文标题】Scala 2.10 - 八进制转义已被弃用 - 现在如何惯用八进制?【英文标题】:Scala 2.10 - Octal escape is deprecated - how to do octal idiomatically now? 【发布时间】:2013-05-11 12:16:51 【问题描述】:

看 https://issues.scala-lang.org/browse/SI-5205 和 https://github.com/scala/scala-dist/pull/20

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

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

编辑 - unix 权限是八进制

【问题讨论】:

引用Seth Tisue:“八进制文字是马马虎虎的东西”。几乎没有人使用它们,几乎每个人都被一个奇怪的事实所困扰,例如021 == 17. unix 权限是八进制 【参考方案1】:

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

【讨论】:

并且通过分配给一个 CONSTANT_VALUE(当然是在 object 上)你的运行时开销不是问题,你已经知道你正在处理什么,也许甚至“为什么”。【参考方案2】:

文字语法已经消失了(或者我猜是消失了),并且不太可能以任何形式回归,尽管有像 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

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

【讨论】:

查看我对 Scala 2.11 更新的回答。我没有按照 OP 的要求编辑 @Travis Brown 的代码来保留 Scala 2.10 版本 这有助于使用八进制值,但不能处理存储在 csv 中的值,或者我错过了什么?【参考方案3】:

这是@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.")
      
    """)
  

【讨论】:

以上是关于Scala 2.10 - 八进制转义已被弃用 - 现在如何惯用八进制?的主要内容,如果未能解决你的问题,请参考以下文章

HttpEntity 现在在 Android 上已被弃用,还有啥替代方案?

GLSL——texture1D 已被弃用,改用啥?

PageRequest 构造函数已被弃用

@angular-cli 安装失败,请求被弃用@2.88.2:请求已被弃用(mac)

现在 Google 网络搜索 API 已被弃用,还都有哪些替代方案? [关闭]

解决Vscode提示bodyparser已被弃用的问题