2017-05-06 2 views
1

Any()::toString을 사용하여 KCallable을 만든 경우 나중에 참조 할 때 인스턴스 (call을 사용하는 경우)를 전달할 필요가 없습니다.Kotlin 함수에 인스턴스 매개 변수가 필요한지 확인합니다.

Any::toString (Any이 아닌 인스턴스)을 사용하여 생성 된 경우 Any 인스턴스를 전달해야합니다.

내 질문에 내가 인스턴스 매개 변수를 전달해야하는지 여부와이 매개 변수가 필수 항목인지 여부를 쉽게 알 수있는 방법은 무엇입니까?

내가 할 수있는 방법을 발견 :

callable.parameters[0].kind == KParameter.Kind.INSTANCE

을하지만, 꽤 좋은하지 내가이 문제를 해결하는 쉬운 또는 권장되는 방법이 있는지 궁금합니다. 감사!

답변

1

당신이 제안한 방법의 개선은 instanceParameter 속성을 확인하는 것입니다

또한
val isInstanceCallable = callable.instanceParameter != null 

, fun Any.foo() = ... 같은 확장 기능은 instanceParameter에서 널해야합니다 : 그것은 null가 아닌 경우, 다음 호출은 인스턴스를 기대 , extensionReceiverParameter도 확인하고 싶을 것입니다. 당신은 단지 호출 참조로 작업해야하는 경우가 바운드 수신기 (이 바인딩되는 즉, 인스턴스)를 가지고 있는지

또한

, 당신은 확인할 수 있습니다.

val bound = (callable as CallableReference).boundReceiver != CallableReference.NO_RECEIVER 

(runnable example)

+0

그러므로 당신은 단지 그것으로 반환 된 값을 비교해야하는 호출 참조가 결합되지 않은 경우

val instance = (callable as CallableReference).boundReceiver 

, 그것은 특별한 값 CallableReference.NO_RECEIVER를 반환합니다 다음 boundReceiver 속성을 사용하여 그래서'instanceParameter'가 null을 반환하면 호출 가능한 소유자를 전달할 필요가 없다는 것을 의미합니다, 그렇습니까? – Mibac

+0

거의. 'fun Any.foo() = 1' :'instanceParameter == null'을 가질 것이므로'extensionReceiverParameter'도 확인하고 싶을 것입니다. – hotkey

관련 문제