最近,我一直在研究Flutter的生态系统,而Dart已证明自己是一种简洁明了的语言。
当前,我正在寻找一种最佳实践来运行可选变量不为空的方法。
换句话说,我正在Dart中寻找类似于Kotlin的 let运算符的东西:
variable?.let {
doStuff();
doABitMoreStuff();
logStuff();
}
有人对此有任何想法或最佳做法吗?
我查看了Dart的文档,但没有找到符合我要求的内容。
国王的问候,
答案 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);
}
}
答案 6 :(得分:0)
即使Dart不像Kotlin那样具有let
这样的行为,但是我们当然可以用简洁易读的代码来模仿它。也许是这样的:
void main() {
String str = null;
str?.isEmpty ?? Function.apply(() {
print("Hey there you cheeky null valued variable");
}, []);
}