Mavjud `to``` usulini ortiqcha yuklab olish

StringLike da toInt usuli hech qanday argumentlarni qabul qilmaydi va faqat kasr hisoblash mumkin. Shunday qilib, ikkilikni tahlil qilish uchun, hex va hokazolarni Java kodi uchun Integer # parseInt (String s, int radix) ga murojaat qilishimiz kerak.

Ushbu vaziyatni bartaraf etishga urinib, men quyidagilarni sinab ko'rdim

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

Biroq,

"101".toInt(2)

REPL kompilyatorining "ajoyib tarzda qulab tushishiga" sabab bo'ladi va olingan kodda ham ishlamaydi.

Mavjud usullarni "kutubxonamni boyitishni" qo'llash orqali cheklash kerakmi?

7
@tomasz: har doim REPLni qulab tushganim uchun eskirgan bo'lsam, hozircha 100000 obro'-e'tiborga egaman.
qo'shib qo'ydi muallif Kim Stebel, manba
Sizning yangi tagligingizga ishonchingiz komilmi? "pimping" .
qo'shib qo'ydi muallif Blender, manba
Compiler crash hech qachon yomon kodning natijasi emas, faqat yomon kompilyator. Yoki, boshqacha aytganda, xato kompilyatorda. * Ehtimol, kompilyator chindan ham halok bo'lishiga qaramasdan, kod ham to'g'ri emas, bir nechta istisnolar mavjud.
qo'shib qo'ydi muallif Daniel C. Sobral, manba
REPL :-)ni buzish uchun +1.
qo'shib qo'ydi muallif Tomasz Nurkiewicz, manba
@Blender: fixed :)
qo'shib qo'ydi muallif tenshi, manba

2 javoblar

Yomon ishlamasdan, ishlayotgan "101" .toInt (2) REPLga parametrlarni qabul qilmasligini aytish menga sabab bo'ladi. Ya'ni, nima sodir bo'layotgani, "101" .toInt bilan ishlayotganini, keyin esa apply (2) ni chaqirishga urinishdir, bu mantiqiy emas. Muammoni bartaraf qilish uchun sizga toInt kodini kiritishni tavsiya qilaman.

tahrirlash

Men o'zimning bir necha muvaffaqiyatga ega bo'ldim. Men aniq qilib aytganda, ixchamlangan mag'lubiyat sinfini aniqladim

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

implicit def strToToIntable(s:String) = new StrToRadixInt(s)

Va REPL baxtli edi:

scala> "101".toInt(2)
res4: Int = 5
3
qo'shib qo'ydi
Javob yuqorida ko'rsatilgan havolalarda, shuning uchun uni qabul qiling
qo'shib qo'ydi muallif Luigi Plinge, manba
Ko'rinishlarga ko'ra, skala yuklamasdan yuklanish usullarini engib o'tishni xohlamaydi: qarang: stackoverflow.com/questions/4480250/… va stackoverflow.com/questions/4443783/…
qo'shib qo'ydi muallif Dylan, manba
Ammo keyin siz parametrsiz toInt deb chaqira olmaydi ...
qo'shib qo'ydi muallif Mark Jayxcela, manba

REPL buzilishi kerak emas - bu xato. Lekin shunga qaramay, ismlarning haddan tashqari ko'tarilishi biroz tushkunlikka tushib qolgan va ayrim kontekstlarda ham qo'llab-quvvatlanmagan. Boshqa nomdan foydalaning:

implicit def parseBase(s: String) = new { def base(b: Int) = Integer.parseInt(s,b) }

scala> "10110" base 2
res1: Int = 22
1
qo'shib qo'ydi