문제
제가 궁금했는데 여부 투명 implicit
변환은 정말 좋은 생각하고 있는지 여부를 실제로 사용하는 것이 좋 implicits 상,um, 명시적으로.예를 들어,내가 가는 방법이 허용 Date
매개 변수로 나가는 암시적으로 변환하는 String
로 Date
:
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
누구?) 및 이러한 사용할 수 있습니 우리를 활용하의 힘 implicit
s.
해결책
저는 믿습니다"더 명시적인"방법을 암시적 변환은 훨씬 더 좋은 측면에서의 가독성은 보다 완전히 투명한 하나,적어도 이것은 예입니다.
제 생각에는,사용 implicit
s 완전히 투명하게서 형식 A
을 유형 B
가 확인할 수 있을 때 상 view 개체의 유형 A
로 사용할 수 있다고 여겨지고 있을 때마다 그 개체의 유형 B
이 필요합니다.예를 들어,암시적으로 변환 String
을 RandomAccessSeq[Char]
항상 하는 말이- String
상,개념적으로 볼 수 있의 순서로 문자를(C 에서 문자열이 그 는 일련의 문자,예를 들어).전화 x.foreach(println)
에 대한 감각을 모든 String
s.
다른 한편으로,더 명시적 변환해야할 때 사용하는 개체의 유형 A
수 때때로 로 사용할 수 있는 개체의 유형 B
.에서 당신의 예,전화 foo("bar")
지 않은 의미가와에서 오류가 발생합니다.로 스칼라지 않을 확인 예외를 제외하고,전화 foo(s.toDate)
명확하게 신호를 수 있다는 예외가 될 throw(s
되지 않을 수도 유효한 날짜).또한, foo("bar".toDate)
분명히 잘못 보이는 동안,당신은 필요 설명서를 참조하는 이유 foo("bar")
이 틀렸다는 것에 동의합니다.이 예제에서는 스칼라는 표준 라이브러리에서 전환 String
s Int
s 을 통해, toInt
방법 RichString
포장지(String
s 볼 수 있으로 Int
s 지 모든 시간).
다른 팁
할 때는 암시적으로 변환 X Y(변환 같이 문자열에서 날짜상),당신은 기본적으로 말했다,당신은 전체 제어 쓰 X 첫 번째 장소에서,당신은 만든 것 X 을 구현하 또는 수의 서브 클래스 Y.
면 그것은 말 X 을 구현하 Y 을 추가,변환입니다.지 않는 경우,다음 어쩌면 그것은 적합하지 않습니다.예를 들어,그것은 의미에 대한 문자열을 구현하 RandomAccessSeq[Char],그러나 어쩌면 이해가 되지 않는 문자열을 구현하는 날(그러나 문자열을 구현하 StringDate 잘 보인다).
(저는 조금 늦게,그리고 Flaviu 은 훌륭한 대답을 추가하는 방법에 대한 코멘트에 대해 생각 implicits.)