2015-01-12 3 views
0

소개 내가 사용하고 외부 라이브러리에서함수를 매개 변수로 전달하는 구문을 단축하는 방법은 무엇입니까?

는, 클래스 org.scaloid.common.TraitAdapterView는 다음과 같이 정의 된 함수 onItemClick이 포함

trait TraitAdapterView[V <: android.widget.AdapterView[_]] 
: V는 클래스의 상단에 정의되어

@scala.inline 
    def onItemClick[U](
    f : scala.Function4[android.widget.AdapterView[_], 
         android.view.View, 
         scala.Int, 
         scala.Long, U]) : V = 
    { /* compiled code */ } 

실제 질문이 있습니다.

는 내 코드에서 다음 함수를 정의

: 않습니다

listView.onItemClick((a, b, c, d) => onClick(a, b, c, d)) 

하지만 다음

def onClick(parent:AdapterView[_] , view:View, position:Int, id:Long) = 3 

내가 호출 할 수있어입니다하지 일 :

listView.onItemClick(onClick) 

왜? 작동하도록 변경하려면 어떻게해야합니까?

+0

'온 클릭 (_, _, _, _)'일 수 있습니다

관심을

이 REPL 세션을 고려한다. –

+0

오류 메시지가 무엇입니까? – Dimitri

+1

감사합니다, @ GáborBakos. 사실,이 작업은 : onClick _' –

답변

0

onItemClick[U]에 대한 인수는 유형 매개 변수에 의해 설명 된대로 Function4, 즉 4 개의 인수를 취하는 함수입니다. 이 표기법을 쓸 때 :

(a, b, c, d) => onClick(a, b, c, d) 

거의 올바른 서명으로 된 익명의 Function4를 작성하고 있습니다. 나는 이것을 컴파일해야한다고 생각하지 않는다. 확실한가요? 문제는 onClick의 반환 유형이 Int이고 onItemClick의 인수가 V<: android.widget.AdapterView[_] 인 예상 반환 유형이 Int과 호환되지 않는 것입니다.

이 표기법을 사용하는 경우 : 당신은 일반적으로 onClick에 전화를 호출하고 onItemClick 기능의 결과를 제공하지만, 실종 인수가 있기 때문에, 스칼라 컴파일러는 함수로 해석해야 할 것이다

onClick 

참고. onClick의 결과는 onItemClick의 인수와 호환되지 않으므로 오류가 발생합니다. 오류에 대한 컴파일러 출력을 포함시킬 수 있습니까?

이 표기법을 사용하는 경우 :

onClick _ 

당신이 onClick라는 이름의 기능을 참조하고 onItemClick에 전달됩니다. onClick이 올바른 종류의 Function4이므로 (결과 유형이 호환 가능하다고 가정 할 때) 작동해야합니다.

scala> def foo(f: Function1[Int,Int]) : Int = f(1) 
foo: (f: Int => Int)Int 
scala> def bar(i: Int) : Int = 3 
bar: (i: Int)Int 
scala> foo(bar) 
res0: Int = 3 
scala> foo(bar _) 
res1: Int = 3 
scala> foo((i) => bar(i)) 
res2: Int = 3 
관련 문제