2017-05-06 26 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