【问题标题】:What is the implementation of call() in dart?dart 中 call() 的实现是什么?
【发布时间】:2020-03-09 00:43:10
【问题描述】:

我不知何故发现call() 方法适用于每个函数。 使用这种方法,我可以将我的if (callback != null) callback() 更改为callback?.call()

于是我试图找到call()的实现和文档,但是我找不到。它只是内置方法吗?这种方法的实现将是什么? Function.apply()会在里面调用吗?

【问题讨论】:

    标签: dart callable


    【解决方案1】:

    所有 Dart 函数(具有函数类型而不是类/接口类型的对象)都有一个call 方法。

    call 方法与函数本身具有相同的函数类型,并且在调用它时行为完全相同。你甚至可以说调用一个函数就是隐式调用它的call 方法。 而且,并非巧合,规范实际上确实这样说:如果您编写函数调用e1(e2, e3),那么编译器会检查e1 是否有call 方法,如果有,则将其转换为方法 em> 调用e1.call(e2, e3)

    其他 Dart 对象也可能有 call 方法。只是接口类型的普通方法,但是如果类Cint call(int x) => ...这样的调用方法,而cC类型,那么c(e2, e3)也会转换为c.call(e2, e3)。它必须是一个call 方法,而不仅仅是一个返回函数的call getter。

    【讨论】:

    • 为了将来参考,Dart 语言规范 2.10 版在 17.15.5 中提供了详细信息。我也在看。
    • 通过“call”调用函数很慢。奇迹。
    • 这可能取决于你在做什么。我写的一个快速基准测试表明,当f 具有函数类型时,f(i)f.call(i) 之间没有显着差异。 dartpad.dev/c42130fcee303bc7a342ebeef36429a6?null_safety=true
    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 2020-12-31
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多