2017-05-06 65 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空,你也可能想檢查extensionReceiverParameter。另外,如果您只需要使用可調用的引用,就可以檢查它們是否有綁定的接收者(即綁定的實例)。使用boundReceiver屬性:

val instance = (callable as CallableReference).boundReceiver 

當調用引用是未綁定的,它會返回一個特殊值CallableReference.NO_RECEIVER,所以你只需要返回值和它相比:

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

(runnable example)

+0

所以當'instanceParameter'返回null時,這意味着我不需要傳遞可調用的所有者,對吧? – Mibac

+0

差不多。還有擴展函數:'fun Any.foo()= 1':它將有'instanceParameter == null',所以你可能也想檢查'extensionReceiverParameter'。 – hotkey