2012-06-27 5 views
4

암시 적 변환은 스칼라의 주요 논란이되는 기능인 것처럼 보이지만 C#에서는 그다지 눈에 띄지 않습니다. 두 언어의 차이점은 무엇입니까? 스칼라에서 implicits를 사용해야하는 곳이 있습니까? 아니면 C#에서와 같이 변환을 암시 적으로 또는 명시 적으로 수행할지 여부를 항상 선택할 수 있습니까? 종종 C#에서는 소비자가 나 자신이더라도 프로그래머의 의도를 유형 확인하기 위해 변환을 명시 적으로 사용하는 것을 좋아했습니다. 스칼라 및 C에서 암시 적 컨버스 스

오른쪽도 C# 또는 스칼라 암시 적 분할 또는 메소드/함수 매개 변수를 결합 할 수 있다는 말에 나는 건가요? def myMethod (v1 : Int, v2 : Int)는 매개 변수 목록으로 Tuple2 [Int, Int]를 허용하지 않으며 yourMethod (v1 : Tuple2 [Int, Int])는 매개 변수로 두 개의 int를 허용하지 않습니다 명부. 아마도 암시 적/명시 적 매개 변수 분리/결합이 언어 설계자에 의해 고려되었을 것입니다. 여러 그래픽 라이브러리의 점 구조를 사용할 때이 기능이 바람직하다는 것을 알았습니다.

답변

3

주요 논란 기능

어떻게 든 논쟁을 놓친, 그래서 나는 그것이 중요한 하나입니다 의심한다.

암시 적 변환이 가능하지만, 일반적 특성에 따라, 체험자 스칼라 개발자가 눈살을 찌푸리게.

암시 적 변환은 "확장"클래스를 통해 유형에 메소드를 추가하기 위해 존재

는 다음이 가능합니다. 이 확장 클래스는 매개 변수, 정의 또는 변수의 형식으로 사용되는 형식이 아니며 해당 메서드는 자체를 반환하지 않지만 적용 가능한 경우 원래 형식을 반환합니다.

암시 적 변환을 통해 프로그램에서 일반적으로 사용되는 두 가지 유형간에 변환이 이루어지면 나쁜 것으로 간주됩니다. 사실, 스칼라 2.10은 이런 종류의 사용에 대한 경고와 함께 올 것이다.

Java와 Scala 컬렉션 간의 변환에 사용할 수있는 두 패키지 (scala.collection.JavaConversions 및 scala.collection.JavaConverters)는 분명히 구분됩니다. 후자는 이전 버전에서 사용 된 암시 적 변환 스타일이 나쁜 것으로 간주 되었기 때문에 정확하게 존재합니다.

스칼라에서는 특정 범위 내에서 사용할 수없는 암시 적 변환을 허용하지만 거의 사용하지는 않습니다. 반면에 플래그 -Xlog-implicit-conversions을 사용하면 암시 적 변환이 발생한 위치를 추적 할 수 있습니다.

스칼라의 기본 범위에는 암시 적 유형 변환이 많지 않습니다. A StringSeq[Char]으로 볼 수 있으며 "기본"숫자 유형은 유형 확장이 있습니다. 즉, 더 작은 유형은 더 큰 유형으로 볼 수 있습니다.지금 당장 기억하지 못하는 다른 사람들이있을 수 있지만, 일반적으로 말하자면, 그것을 사용하기 위해서는 암시 적 변환을 가져와야합니다.

+0

논란의 여지가 : 어쩌면 나는 막대기의 끝 부분을 잘못 잡았을 것이지만, 함축 된 생각은 "복잡함"논쟁의 대부분에있는 것처럼 보였다. 내 암시 적 생성이 SIP 18의 기본 기능 이외의 기능으로 전환되고 있음을 알 수 있습니다. –

+1

@RichOliver "Implicits"와 "Implicit Convertions"는 같은 것이 아닙니다. 후자는 전자의 견지에서 구현되지만 거의 요점은 아닙니다. implicits의 개념 - 암시 적 변환과는 반대로 Scala는 매우 독특합니다 - 실제로 일부 비판의 대상입니다. 그렇다하더라도, 나는 그것을 복잡성 논쟁의 "바닥"에 두지 않을 것이다. –

+0

아, 이것이 내가 놓친 중요한 정보였습니다. –

9

스칼라와 C# 암시 적 변환 사이의 주요 차이점은 스코프있는 사용할 수있는 어디 암시 적 변환 정의 할 수있는 스칼라에서 훨씬 더 유연한 범위 지정 규칙입니다.

동안은 C#으로 암시 적 변환은 클래스 중 하나는 당신이 당신의 클래스는 특정 상황에서 특정 기능을 추가 장식 할 수 있습니다 스칼라에서, 다른 클래스로 볼 수있다라고하는 방법입니다.

또한 C#의 암시 적 변환을 클래스 자체에서 정의해야하지만 Scala에서는 기존 클래스를 장식하는 강력한 도구 인 암시 적 변환을 외부 적으로 추가 할 수 있습니다. 스칼라에는 미리 정의 된 명시 적 전환.

+0

마지막 포인트는 +1입니다. 이것이 실제로 모든 차이를 만들어냅니다. –

관련 문제