2012-08-23 3 views
7

Foo 암시 적 형식을 사용하는 몇 가지 다른 메서드를 호출하는 메서드가 있습니다. Foo 내부에 암시 적으로 넣고 싶습니다. 이다 내가 그것을 할 방법 :메서드 내에서 암시적인 인수 표시

def myMethod(a: Int, f: Foo) = { 
    implicit val implicitF = f; 
    somethingThatNeedsFoo(a) 
} 

내가 FOOS이 MyMethod라는이 사용되는 맥락에서 암시하지 않기 때문에 MyMethod라는의 서명에 암시 f을 표시하지 않습니다. 내 질문 :이 효과를 달성하기 위해 임시 변수를 사용하는 것보다 관용적 인 (또는 간결한) 방법이 있습니까?

+2

이 간단한 예제에서는 implicits를 사용하는 대신 명시 적으로'f'를 전달하는 것이 더 쉬울 것입니다. 그러나 실제 코드가 내재적으로 가치있게 만들 정도로 충분히 복잡하다고 가정합니다. 이 경우 메서드 내에서 암시 적으로 매개 변수 자체를 선언하지 않으려는 경우 메서드 내에서 암시 적 val을 선언하는 솔루션이 가장 좋은 방법이라고 생각합니다. – DaoWen

+0

@DaoWen 정말 답변으로 의견을 제출해야합니다. –

+0

@Aaron Novstrup - 네, 아마도 내가 가지고 있어야하는 다른 답변을 살펴보십시오. 나는 아직도 여기 꽤 새로운데, 그래서 나는 답하기와 코멘트의 범주에 무엇이 들어 있는지 결정하는 데 어려움을 겪고있다. – DaoWen

답변

4

암시 적 매개 변수를 명시 적으로 전달할 수 있으므로 호출자의 암시 적 범위에 Foo가 없더라도 호출자는이를 명시 적으로 전달할 수 있습니다. 나는이 실제로 사용되는 본 적이

def myMethod(a: Int, f: Foo) = 
    somethingThatNeedsFoo(a)(f) 
6

하지만 당신은 이름에 변수를 바인딩을 방지 할 수 있습니다 주석으로

, 당신은 somethingThatNeedsFoo에 푸를 전달하기 위해이 같은 트릭을 사용할 수 있습니다. 물론 밑줄을 사용하십시오.

implicit val _ = f 

이 사용법에 대해 조언하고 싶습니다.

+0

이 사용법에 대해 조언하는 이유는 무엇입니까? 나는 결코 사용되지 않을 식별자로 로컬 네임 스페이스를 오염시키는 것을 피하고 코드에서 "노이즈"가 적다는 점을 좋아한다. 혼란스러운 컴파일러 오류 가능성? –

+1

나는 밑줄이 '이 암시 적으로 모두 무시/비활성화'로 인식 될 수 있기 때문에 혼란 스러울 수도 있다고 생각합니다. ('import predef. {any2stringadd => _, _}'와 같이). – Debilski

관련 문제