在 Dart 中,将“lambda”设置为构造函数的一部分或设置普通类有什么区别

In Dart, what's the difference between setting a `lambda` as part of a constructor or setting a normal class

提问人:Carlos Daniel 提问时间:8/4/2023 更新时间:8/4/2023 访问量:21

问:

我在构造类时见过这种东西:

  class A {
    A(this.attr)

    final String Function() attr;
  }
  main() {
    final myStringAttr = 'some-string';

    final a = A(()=> myStringAttr);
  }

如果我的定义是,上面的工作方式与它的工作方式相同:A class

  class A {
    A(this.attr);

    final String attr;
  }
  main() {
    final myStringAttr = 'some-string';

    final a = A(myStringAttr);
  }

那么,有什么区别呢?带有 lambda 的构造函数与没有 lambda 的构造函数有什么不同?lambda 的性能是否较差?何时使用 lambda?

Dart lambda 闭包

评论

0赞 jamesdlin 8/4/2023
第一个版本要求每次使用时都调用回调。这会增加额外的开销,但也允许动态生成不同的值。例如,提供的回调可以在不同情况下返回不同的 s。如果不看到实际代码,就很难知道意图。attrattrString

答:

0赞 Alexander 8/4/2023 #1

如果字符串的计算成本很高(例如,它插入了计算速度较慢的段,涉及大量处理来格式化事物等),那么 lambda 会推迟对该字符串的评估,直到真正需要它。

对于断言(几乎从未触发过断言,因此消息最常被丢弃)、异常消息等,这种情况很常见。

对于简单的字符串,lambda 的额外/分配实际上会稍微慢一些,但使用它的作者打赌它得到了回报,因为复杂字符串的大量节省。