2013-05-16 13 views
10

Zobacz https://issues.scala-lang.org/browse/SI-5205 i https://github.com/scala/scala-dist/pull/20Scala 2.10 - Ośmioroowa ucieczka jest przestarzała - jak teraz robić ósemkowo idiomatycznie?

wartości ósemkowe początkowe 0 została wycofana z Scala i nie zobaczyć idiomatyczne alternatywy.

Jak sobie radzisz z oktalami w scala 2.10 teraz?

Edit - uprawnienia UNIX są ósemkowy

+1

Cytując [Seth Tisue] (https://groups.google.com/d/msg/scala-debate/ vG4tqdz1SgQ/DZ1Wbm8ZzNsJ): "Cyfry ósemkowe są rzeczami końskimi i buggy". Prawie nikt ich nie używa, a prawie każdy został ukąszony przez dziwaczny fakt, że np. '021 == 17'. –

+0

Uprawnienia unixa są ósemkowe – JasonG

Odpowiedz

17

Dosłowna składnia już nie istnieje (lub, jak sądzę) i raczej nie powróci w żadnej formie, chociaż istnieją alternatywy, takie jak 0o700have been proposed.

Jeśli chcesz coś bardziej jak kompilacji dosłowne w 2.10, można użyć makra (ta konkretna realizacja jest 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.") 
    }) 
    } 
} 

Następnie można napisać następujące:

scala> import OctalLiterals._ 
import OctalLiterals._ 

scala> o"700" 
res0: Int = 448 

Teraz nie płacisz za analizowanie ciągu znaków w czasie wykonywania, a wszelkie nieprawidłowe dane zostaną przechwycone podczas kompilacji.

+0

Dzięki za poświęcony czas. – JasonG

+0

zobacz moją odpowiedź na aktualizację od wersji Scala 2.11. Nie edytowałem kodu @Travisa Browna, aby zachować wersję Scala 2.10 zgodnie z żądaniem OP – jopasserat

10

zawsze można BigInt("21",8) jeśli chcesz analizować ósemkowy.

+0

A przez przypisanie do CONSTANT_VALUE (na 'obiekcie', oczywiście), twoje obciążenie środowiska wykonawczego nie jest problemem i masz pojęcie, z czym masz do czynienia, a może nawet". czemu". –

2

Oto zaktualizowana wersja odpowiedzi @Travis Browna, jak 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.") 
     } 
    }""") 
    } 
} 
Powiązane problemy