Литеральный синтаксис пропал (или собирается, я думаю) и вряд ли вернется в любой форме, хотя альтернативы, такие как 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
Теперь вы не платите за разбор строки во время выполнения, и любой недопустимый вход попадает во время компиляции.
Цитирую [Сет Tisue] (https://groups.google.com/d/msg/scala-debate/ vG4tqdz1SgQ/DZ1Wbm8ZzNsJ): «Октальные литералы - это лошадиные и багги». Их почти никто не использует, и почти каждый был укушен причудливым фактом, например, '021 == 17'. –
Разрешения unix - это восьмеричные – JasonG