Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 2.10-不推荐使用八进制转义-现在如何惯用八进制?_Scala_Scala 2.10_Idioms_Octal - Fatal编程技术网

Scala 2.10-不推荐使用八进制转义-现在如何惯用八进制?

Scala 2.10-不推荐使用八进制转义-现在如何惯用八进制?,scala,scala-2.10,idioms,octal,Scala,Scala 2.10,Idioms,Octal,看 和 scala不推荐使用以八进制转义值开头的0,我看不到惯用的替代方法 您现在如何处理scala 2.10中的八进制 编辑-unix权限是octal如果您想解析octal,您可以始终BigInt(“21”,8)。文本语法已经消失(或正在消失,我猜),并且不太可能以任何形式返回,尽管有类似0o700的替代方法 如果您想要2.10中更像编译时文字的东西,可以使用宏(此特定实现为): 然后,您可以编写以下内容: scala> import OctalLiterals._ import Oc

看 和

scala不推荐使用以八进制转义值开头的0,我看不到惯用的替代方法

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


编辑-unix权限是octal

如果您想解析octal,您可以始终
BigInt(“21”,8)

文本语法已经消失(或正在消失,我猜),并且不太可能以任何形式返回,尽管有类似
0o700
的替代方法

如果您想要2.10中更像编译时文字的东西,可以使用宏(此特定实现为):

然后,您可以编写以下内容:

scala> import OctalLiterals._
import OctalLiterals._

scala> o"700"
res0: Int = 448

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

这里是@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
。unix权限是通过分配给一个常量_值(当然是在
对象上)来实现的。您的运行时开销不成问题,您已经知道您在处理什么,甚至可能知道“为什么”.有关Scala 2.11的更新,请参见我的答案。我没有编辑@Travis Brown的代码以保留OPA要求的Scala 2.10版本。这有助于使用八进制值,但不处理存储在csv中的值,例如,或者我遗漏了什么?
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.")
      }
    }""")
  }
}