【发布时间】:2020-03-09 00:43:10
【问题描述】:
我不知何故发现call() 方法适用于每个函数。
使用这种方法,我可以将我的if (callback != null) callback() 更改为callback?.call()。
于是我试图找到call()的实现和文档,但是我找不到。它只是内置方法吗?这种方法的实现将是什么? Function.apply()会在里面调用吗?
【问题讨论】:
我不知何故发现call() 方法适用于每个函数。
使用这种方法,我可以将我的if (callback != null) callback() 更改为callback?.call()。
于是我试图找到call()的实现和文档,但是我找不到。它只是内置方法吗?这种方法的实现将是什么? Function.apply()会在里面调用吗?
【问题讨论】:
所有 Dart 函数(具有函数类型而不是类/接口类型的对象)都有一个call 方法。
call 方法与函数本身具有相同的函数类型,并且在调用它时行为完全相同。你甚至可以说调用一个函数就是隐式调用它的call 方法。
而且,并非巧合,规范实际上确实这样说:如果您编写函数调用e1(e2, e3),那么编译器会检查e1 是否有call 方法,如果有,则将其转换为方法 em> 调用e1.call(e2, e3)。
其他 Dart 对象也可能有 call 方法。只是接口类型的普通方法,但是如果类C有int call(int x) => ...这样的调用方法,而c有C类型,那么c(e2, e3)也会转换为c.call(e2, e3)。它必须是一个call 方法,而不仅仅是一个返回函数的call getter。
【讨论】:
f 具有函数类型时,f(i) 和f.call(i) 之间没有显着差异。 dartpad.dev/c42130fcee303bc7a342ebeef36429a6?null_safety=true