Dart与Kotlin的let等效吗?

时间:2018-09-03 10:55:32

标签: kotlin dart flutter

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

当前,我正在寻找一种最佳实践来运行可选变量不为空的方法。

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

variable?.let {
    doStuff();
    doABitMoreStuff();
    logStuff();
}

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

我查看了Dart的文档,但没有找到符合我要求的内容。

国王的问候,

7 个答案:

答案 0 :(得分:4)

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

Dart还没有不可为空的类型,因此区分在Dart中并不重要。 只需使用if (x != null) { ... }。 如果Dart获得了不可为null的类型,则可以确信null的检查条件还将在块内将x提升为不可为null(如果x是局部变量,没有在代码块内进行更改,则可能会有其他限制。)

从您的其他评论看来,您可能想要使用x?.run { ... }的Kotlin行为,该行为在lambda块内将this绑定到x。 Dart中没有相应的功能。您无法覆盖this,它始终绑定到当前方法所调用的对象,即使在嵌套闭包内部也捕获this的值,就像它们捕获其他变量一样。

答案 1 :(得分:2)

Dart的等效项将是级联运算符和null检查的组合:

MyClass foo;

if (foo != null) {
  foo
    ..doStuff()
    ..doABitMoreStuff()
    ..logStuff();
}

不过,您可以使用静态函数自己制作

typedef T LetCallback<T>(T value);

T let<T>(T value, LetCallback<T> cb) {
  if (value != null) {
    return cb(value);
  }
}

然后这样使用:

let<MyClass>(foo, (it) {

})

答案 2 :(得分:1)

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

class Foo {
  var x = 42;
  void bar() {
    () {
      print(x);
      doStuff();
      doABitMoreStuff();
      logStuff();
    }();
  }
}

答案 3 :(得分:1)

没有直接等效项,因为在Dart中不需要它。 Dart更像Java,您通常会得到类似的解决方案。

Dart中几乎没有语法糖。它应该很容易学习。

此外,Dart不会执行严格的null检查,所有变量都可以为null,并且语言是单线程的。这就是为什么不需要let的原因。请改用if

if(variable != null) {
  doStuff();
  doABitMoreStuff();
  logStuff();
}

答案 4 :(得分:1)

使用新的Dart扩展功能,我们可以定义:

words = words.withColumn('date_time', F.col('date_time').cast('timestamp'))

w = F.window('date_time', '30 seconds', '10 seconds')
words = words \
   .withWatermark('date_format', '1 minutes') \
   .groupBy(w).agg(F.mean('value'))

这将允许写extension ObjectExt<T> on T { R let<R>(R Function(T that) op) => op(this as T); } 而不是x.let(f)

答案 5 :(得分:1)

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

extension ScopeFunctionsForObject<T extends Object> on T {
  ReturnType let<ReturnType>(ReturnType operation_for(T self)) {
    return operation_for(this);
  }
}

用法:enter image description here

答案 6 :(得分:0)

即使Dart不像Kotlin那样具有let这样的行为,但是我们当然可以用简洁易读的代码来模仿它。也许是这样的:

void main() {
  String str = null;

  str?.isEmpty ?? Function.apply(() {
    print("Hey there you cheeky null valued variable");
  }, []);
}