2013-05-16 2 views
10

См https://issues.scala-lang.org/browse/SI-5205 и https://github.com/scala/scala-dist/pull/20Scala 2.10 - Octal escape устарел - как сделать восьмеричную идиоматику сейчас?

значения побега восьмиштырькового ведущие 0 устарели из Скале, и я не вижу идиоматическую альтернативы.

Как вы справляетесь с восьмеричными в scala 2.10 сейчас?

Edit - Unix разрешений в восьмеричном

+1

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

+0

Разрешения unix - это восьмеричные – JasonG

ответ

17

Литеральный синтаксис пропал (или собирается, я думаю) и вряд ли вернется в любой форме, хотя альтернативы, такие как 0o700have 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 

Теперь вы не платите за разбор строки во время выполнения, и любой недопустимый вход попадает во время компиляции.

+0

Спасибо за ваше время. – JasonG

+0

см. Мой ответ на обновление с версии Scala 2.11. Я не редактировал код @Travis Brown, чтобы сохранить версию Scala 2.10 по запросу OP – jopasserat

10

Вы всегда BigInt("21",8), если вы хотите, чтобы разобрать восьмеричной может.

+0

И, назначив CONSTANT_VALUE (конечно, «объект»), накладные расходы на выполнение не являются проблемой, и у вас есть представление о том, с чем вы имеете дело, и, возможно, даже " Зачем". –

2

Вот обновленный вариант ответа @Travis Брауна, от 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.") 
     } 
    }""") 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^