Dart 相当于 Kotlin 的 let 是什么?

Ric*_*ira 14 dart kotlin flutter

最近我一直在深入研究 Flutter 的生态系统,Dart 已经证明了自己是一门简洁的语言。

目前,如果可选变量不为空,我正在寻找运行方法的最佳实践

换句话说,我在 Dart 中寻找类似于 Kotlin 的let 运算符的东西

variable?.let {
    doStuff();
    doABitMoreStuff();
    logStuff();
}
Run Code Online (Sandbox Code Playgroud)

有人对此有任何想法或最佳实践吗?

我查看了 Dart 的文档,但没有发现任何符合我要求的内容。

国王问候,

use*_*643 9

使用新的 Dart 扩展函数,我们可以定义:

extension ObjectExt<T> on T {
  R let<R>(R Function(T that) op) => op(this as T);
}
Run Code Online (Sandbox Code Playgroud)

这将允许写入x.let(f)而不是f(x).


Rém*_*let 8

Dart 的等效项是一个空感知级联运算符:Dart 方法将是使用空感知级联

SomeType? variable = ...

variable
   ?..doStuff()
    ..doABitMoreStuff()
    ..logStuff();
Run Code Online (Sandbox Code Playgroud)

空感知级联的工作方式与普通级联类似,不同之处在于如果接收器值为null,则不执行任何操作。


不过,您可以使用静态函数创建自己的函数:

typedef T LetCallback<T>(T value);

T let<T>(T value, LetCallback<T> cb) {
  if (value != null) {
    return cb(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用:

let<MyClass>(foo, (it) {

})
Run Code Online (Sandbox Code Playgroud)


lrn*_*lrn 5

Kotlin 中x?.let{ }和之间的区别在于if (x != null) { }前者提升x为不可为空。由于 Kotlin 具有不可为空的类型,它可以防止您需要编写x!!断言块内的不可为空性。

Dart 还没有不可为空的类型,因此这种区别在 Dart 中并不重要。只需使用if (x != null) { ... }. 如果 Dart 得到不可为空的类型,你可以放心,null条件中的检查也会x在块内提升为不可为空(如果x是局部变量,在块内没有发生变异,其他限制可能适用)。

从您的其他评论来看,听起来您可能想要 Kotlin 行为x?.run { ... },它绑定thisxlambda 块内部。Dart 中没有相应的功能。您不能覆盖this,它始终绑定到调用当前方法的对象,即使在this捕获其他变量的嵌套闭包中也是如此。


小智 5

我们可以使用 Dart 2.6 或更高版本来实现。

extension ScopeFunctionsForObject<T extends Object> on T {
  ReturnType let<ReturnType>(ReturnType operation_for(T self)) {
    return operation_for(this);
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:https : //github.com/YusukeIwaki/dart-kotlin_flavor#let


Gün*_*uer -1

我想闭包可以满足你的要求

class Foo {
  var x = 42;
  void bar() {
    () {
      print(x);
      doStuff();
      doABitMoreStuff();
      logStuff();
    }();
  }
}
Run Code Online (Sandbox Code Playgroud)