Қолданыстағы `to``` әдісін артық жүктеу

toInt әдісіндегі StringLike әдісі ешқандай аргументтерді қабылдамайды және тек ондық бөлікте талдау мүмкін. Екілік, hex және т.б. талдау үшін біз Java-ның Integer # parseInt (String s, int radix) -қа жүгінуіміз керек.

Осы жағдайды түзетуге тырысып, мен келесі әрекеттерді жасадым

implicit def strToToIntable(s: String) = new {
  def toInt(n: Int) = Integer.parseInt(s, n)
}

Алайда,

"101".toInt(2)

REPL компиляторының «керемет түрде апатқа ұшырауы» және компиляцияланған кодта жұмыс істемейді.

«Менің кітапхананы байыту» үлгісін қолданып, қолданыстағы әдістерді шамадан тыс жүктеуге шектеу бар ма?

7
@tomasz: егер мен REPL-ді апатқа ұшырататын болсам, 100000-ға жуық беделге ие боламын.
қосылды автор Kim Stebel, көзі
Жаңа тегіңіз «pimping» екеніне сенімдісіз бе?
қосылды автор Blender, көзі
Компилятордың бұзылуы ешқашан жаман кодтың нәтижесі емес, тек жаман компилятор. Немесе, басқаша айтқанда, қате компиляторда. * Сонымен қатар, компилятор шынымен құлап кетпеуі керек болса да, кодтың дұрыс емес екендігі туралы бірнеше ерекшелік бар.
қосылды автор Daniel C. Sobral, көзі
REPL :-) құлдырауы үшін +1.
қосылды автор Tomasz Nurkiewicz, көзі
@Blender: тіркелген :)
қосылды автор tenshi, көзі

2 жауаптар

  • «101» .toInt (2) іске қосылмаған жағдайда REPL параметрі параметрлерді қабылдамайды деп айтады. Сондықтан, менің ойымша, бұл жағдай «101» .toInt жұмыс істеп жатқанын және одан кейін apply (2) дегенді шақыруға тырысады, бұл мағынасы жоқ. Мәселені болдырмау үшін, сіздің шиқылданған toInt түрінің нәзік атауын ұсынамын.

    өңдеу

    Мен жай ғана өзімнің біраз табысқа ие болдым. Мен айқындайтын жолды анық деп анықтадым

    class StrToRadixInt(s:String) {
      def toInt(radix: Int) = Integer.parseInt(s,radix)
    }
    
    implicit def strToToIntable(s:String) = new StrToRadixInt(s)
    

    Және REPL қуанды:

    scala> "101".toInt(2)
    res4: Int = 5
    
  • 3
    қосылды
    Жауап жоғарыдағы сілтемелерде берілген, сондықтан оны қабылдау
    қосылды автор Luigi Plinge, көзі
    Scala шамадан тыс жүктеу әдістерін іске асыру арқылы жеңілдетуді қаламайды: қараңыз: stackoverflow.com/questions/4480250/… және stackoverflow.com/questions/4443783/…
    қосылды автор Dylan, көзі
    Бірақ, сіз параметрлердісіз toInt деп атала алмайсыз ...
    қосылды автор Mark Jayxcela, көзі

    REPL апатқа ұшырауы тиіс - бұл қате. Дегенмен, аттарды шамадан тыс түсіріп, кейбір контексттерде қолдамайды. Басқа атауды қолданыңыз:

    implicit def parseBase(s: String) = new { def base(b: Int) = Integer.parseInt(s,b) }
    
    scala> "10110" base 2
    res1: Int = 22
    
    1
    қосылды