Ric*_*ira 14 dart kotlin flutter
最近我一直在深入研究 Flutter 的生态系统,Dart 已经证明了自己是一门简洁的语言。
目前,如果可选变量不为空,我正在寻找运行方法的最佳实践。
换句话说,我在 Dart 中寻找类似于 Kotlin 的let 运算符的东西:
variable?.let {
doStuff();
doABitMoreStuff();
logStuff();
}
Run Code Online (Sandbox Code Playgroud)
有人对此有任何想法或最佳实践吗?
我查看了 Dart 的文档,但没有发现任何符合我要求的内容。
国王问候,
使用新的 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)
.
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)
Kotlin 中x?.let{ }
和之间的区别在于if (x != null) { }
前者提升x
为不可为空。由于 Kotlin 具有不可为空的类型,它可以防止您需要编写x!!
断言块内的不可为空性。
Dart 还没有不可为空的类型,因此这种区别在 Dart 中并不重要。只需使用if (x != null) { ... }
. 如果 Dart 得到不可为空的类型,你可以放心,null
条件中的检查也会x
在块内提升为不可为空(如果x
是局部变量,在块内没有发生变异,其他限制可能适用)。
从您的其他评论来看,听起来您可能想要 Kotlin 行为x?.run { ... }
,它绑定this
到x
lambda 块内部。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)
归档时间: |
|
查看次数: |
4720 次 |
最近记录: |