Scala 2.10-不推荐使用八进制转义-现在如何惯用八进制?
看 和 scala不推荐使用以八进制转义值开头的0,我看不到惯用的替代方法 您现在如何处理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
编辑-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.")
}
}""")
}
}