문제

제가 궁금했는데 여부 투명 implicit 변환은 정말 좋은 생각하고 있는지 여부를 실제로 사용하는 것이 좋 implicits 상,um, 명시적으로.예를 들어,내가 가는 방법이 허용 Date 매개 변수로 나가는 암시적으로 변환하는 StringDate:

implicit def str2date(s: String) : Date = new SimpleDateFormat("yyyyMMdd").parse(s)

private def foo(d: Date)

다음을 분명히 내가 부를 수 있는 이 투명 implicit 변환:

foo("20090910")

그것이 더 좋을 수 있을 만들라는 사실로 전환하는 문자열로 날짜 더 많은 명시적으?

class DateString(val s: String) { 
  def toDate : Date = new SimpleDateFormat("yyyyMMdd").parse(s) 
}

implicit def str2datestr(s: String) : DateString = new DateString(s)

그래서 그 사용이 더 많은 것 같:

foo("20090910".toDate)

의 장점 이것은 명확한 이후에 무슨 일이 일어나-나는 잡은 몇 시간에 의해 지금 투명 implicit 변환 내가에 대해 알고 있어야(Option 하기 Iterable 누구?) 및 이러한 사용할 수 있습니 우리를 활용하의 힘 implicits.

도움이 되었습니까?

해결책

저는 믿습니다"더 명시적인"방법을 암시적 변환은 훨씬 더 좋은 측면에서의 가독성은 보다 완전히 투명한 하나,적어도 이것은 예입니다.

제 생각에는,사용 implicits 완전히 투명하게서 형식 A 을 유형 B 가 확인할 수 있을 때 view 개체의 유형 A 로 사용할 수 있다고 여겨지고 있을 때마다 그 개체의 유형 B 이 필요합니다.예를 들어,암시적으로 변환 StringRandomAccessSeq[Char] 항상 하는 말이- String 상,개념적으로 볼 수 있의 순서로 문자를(C 에서 문자열이 는 일련의 문자,예를 들어).전화 x.foreach(println) 에 대한 감각을 모든 Strings.

다른 한편으로,더 명시적 변환해야할 때 사용하는 개체의 유형 A때때로 로 사용할 수 있는 개체의 유형 B.에서 당신의 예,전화 foo("bar") 지 않은 의미가와에서 오류가 발생합니다.로 스칼라지 않을 확인 예외를 제외하고,전화 foo(s.toDate) 명확하게 신호를 수 있다는 예외가 될 throw(s 되지 않을 수도 유효한 날짜).또한, foo("bar".toDate) 분명히 잘못 보이는 동안,당신은 필요 설명서를 참조하는 이유 foo("bar") 이 틀렸다는 것에 동의합니다.이 예제에서는 스칼라는 표준 라이브러리에서 전환 Strings Ints 을 통해, toInt 방법 RichString 포장지(Strings 볼 수 있으로 Ints 지 모든 시간).

다른 팁

할 때는 암시적으로 변환 X Y(변환 같이 문자열에서 날짜상),당신은 기본적으로 말했다,당신은 전체 제어 쓰 X 첫 번째 장소에서,당신은 만든 것 X 을 구현하 또는 수의 서브 클래스 Y.

면 그것은 말 X 을 구현하 Y 을 추가,변환입니다.지 않는 경우,다음 어쩌면 그것은 적합하지 않습니다.예를 들어,그것은 의미에 대한 문자열을 구현하 RandomAccessSeq[Char],그러나 어쩌면 이해가 되지 않는 문자열을 구현하는 날(그러나 문자열을 구현하 StringDate 잘 보인다).

(저는 조금 늦게,그리고 Flaviu 은 훌륭한 대답을 추가하는 방법에 대한 코멘트에 대해 생각 implicits.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top