16

https://issues.scala-lang.org/browse/SI-5205 および https://github.com/scala/scala-dist/pull/20を参照 してください。

0 に先行する 8 進数のエスケープ値は scala から廃止されました。慣用的な代替手段は見当たりません。

現在、scala 2.10 で 8 進数をどのように扱っていますか??

編集 - UNIX パーミッションは 8 進数です

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)8進数を解析したい場合はいつでもできます。

于 2013-05-16T15:03:42.163 に答える