2017-12-20 4 views
2

그래,이게 꽤 특별한 kotlin-dsl이지만, 전체적으로 kotlin 언어 자체에 적용된다고 생각합니다. 그래서 나는 그 태그를 사용하지 않을 것입니다. (그것이 SAM와 클래스이기 때문에)이 코 틀린에 작동합니다, 그래서 이상적으로Kotlin이 gradles의 Action 클래스를 람다로 변환 할 수 없다

@HasImplicitReceiver 
public interface Action<T> { 
    /** 
    * Performs this action against the given object. 
    * 
    * @param t The object to perform the action on. 
    */ 
    void execute(T t); 
} 

: 다음 Gradle을 API에서

이 클래스 Action<T>는 다음과 같이 정의된다

val x : Action<String> = { 
    println(">> ${it.trim(0)}") 
    Unit 
} 

그러나 나는 다음과 같은 두 가지 오류를 얻을 :

Unresolved reference it 
Expected Action<String> but found() -> Unit 

FWIW을, 심지어 Action<String> = { input: String -> ... }는 않습니다 작동하지 않습니다.

여기에 정말 흥미로운 부분이 있습니다. 나는 (BTW, 작동) 인 IntelliJ에서 다음을 수행하는 경우 :

object : Action<String> { 
    override fun execute(t: String?) { 
     ... 
    } 
} 

IntelliJ에 내가 할 때, 내가 얻을 제안 Convert to lambda, 아빠 : 더

val x = Action<String> { 
} 

을하지만, it은 여전히 해결되지 않았다. 지금 지정 :

val x = Action<String> { input -> ... } 

다음과 같은 오류가 제공 Could not infer type for inputExpected no parameters. 누군가가 계속하고있는 일을 도와 줄 수 있습니까? Gradle을에서 Action 클래스 HasImplicitReceiver의 주석을 붙일 수 있기 때문입니다

val x: Action<String> = Action { println(it) } 
+0

모두 저에게 잘 맞습니다. 어쩌면 오래된 Kotlin 플러그인 버전일까요? – FWeigl

답변

0

당신은 같은 클래스 이름으로 함수를 참조해야합니다.

단일 파라미터 것처럼 호출 (그루비 코 틀린this, delegate)의 내재적 수신기로 전달 람다 식/폐쇄하기위한 대상으로 SAM 인터페이스를 마크 : 문서에서 람다 식은 확장 메서드 매개 변수 형식입니다.

(강조 광산)

그래서, 다음은 잘 컴파일 :

val x = Action<String> { 
    println(">> ${this.trim()}") 
} 

심지어 단지 ${trim()}를 작성하고 그것의 앞에 this를 생략 할 수있다.

+0

그래서 이것은 정말로 이상하지만, 어떻게 든'Action {println (this)}'이 작동하는 것처럼 보입니다. 나는 왜 람다가 하나의 매개 변수보다는 하나의 수신기로 다루어지고 있는지 알지 못한다. 그러나 적어도 그것은 gradle 빌드의 맥락에서 답이되는 듯하다. 하지만 컴파일러가 gradle 스크립트에서 다르게 동작하는 것을 기대하지는 않습니까? –

관련 문제