2011-10-27 4 views
7

StringLiketoInt 메소드는 인수를 취하지 않으며 10 진수로만 파싱 할 수 있습니다. 따라서 바이너리, 16 진수 등을 파싱하려면 자바의 Integer#parseInt(String s, int radix)에 의존해야합니다. 문제의이 상태를 해결하기위한 시도에서 기존의 'toInt` 메소드 오버로딩

, 나는
"101".toInt(2) 

가 REPL 컴파일러에 "충돌 화려"원인과 컴파일에서 작동하지 않습니다, 그러나 다음

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

시도 코드.

"내 라이브러리 풍부함"패턴을 사용하여 기존 방법에 과부하를 적용하는 데 몇 가지 제한이 있습니까?

+1

새 태그 [ "pimping"] (http://en.wikipedia.org/wiki/Pimping)가 적합합니까? – Blender

+5

+1에 대한 충돌 REPL :-). –

+0

@Blender : fixed :) – tenshi

답변

3

암시 적으로 실행하지 않으면 "101".toInt(2)을 실행하면 REPL이 Int가 매개 변수를 사용하지 않는다고 알립니다. 그래서 무슨 일이 일어나고있는 것 같아요 "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 
+1

하지만 매개 변수없이 'toInt'를 호출 할 수 없습니다 ... –

+4

scala는 implicits를 통해 메소드를 오버로드하는 것을 원하지 않습니다 : http://stackoverflow.com/questions/4480250/scala-pimp-my- library-with-overloads 및 http://stackoverflow.com/questions/4443783/overriding-arithmetic-operators-on-int-via-implicit-conversions – Dylan

+0

답변은 위에 제공된 링크에 있으므로이 것을 수락하십시오 –

1

REPL 충돌하지 않아야 - 그 버그입니다. 그러나 그렇다고하더라도 이름의 과부하는 다소 낙담되고 일부 상황에서는 지원되지 않습니다.

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

scala> "10110" base 2 
res1: Int = 22