Return Dart 级联的值
Return value for Dart cascade
我正在尝试使用 Dart 级联运算符来实现构建器模式。
我有这个(破解)class:
import 'package:test/test.dart';
class Scope
{
void value<T>(ScopeKey<T> key, T value) {}
R run<R>(R Function() callback) => callback();
}
int use(String key) => 18;
我想使用级联来调用 'run' 方法,该方法应该 return 一个值。
我想做的是:
final ageKey = ScopeKey<int>();
final age = Scope()
..value<int>(ageKey, 18);
.run<int>(() => use(ageKey));
expect(age, equals(18));
注意单个“.”在 'run'.
之前
我要做的是:
final ageKey = ScopeKey<int>();
final scope = Scope()..value<int>(ageKey, 18);
final age = scope.run<int>(() => use(ageKey));
expect(age, equals(18));
我的理解是 .. 丢弃 value
调用的结果,取而代之的是 returns Scope
对象。
所以Scope()..value()
应该return一个作用域。
因此我在等电话
Scope()..value().run() => 1
到return 1作为运行的左手操作数应该是Scope
对象。
相反,它会生成一个编译错误:
This expression has a type of 'void' so its value can't be used.
Try checking to see if you're using the correct API; there might be a function or call that returns void you didn't expect. Also check type parameters and variables which might also be
这意味着 .运行 正在使用 value
的 return 值。
我误解了什么?
您可以添加括号,以便在您的 Scope
上调用 .run
。
final age = (Scope()..value<int>(ageKey, 18)).run<int>(() => use(ageKey));
使用级联,您目前可以执行如下操作:
class Collection<T> {
List<T> items = [];
@override
String toString() => 'Items($items)';
}
void main() {
final items = Collection<int>()
..items.add(1);
print(items);
}
这只有效,因为 .add
是在 items
而不是 Collection
上调用的。缺点是如果你想在级联调用之后调用 Collection
上的方法,你必须将表达式括在括号中。
我正在尝试使用 Dart 级联运算符来实现构建器模式。
我有这个(破解)class:
import 'package:test/test.dart';
class Scope
{
void value<T>(ScopeKey<T> key, T value) {}
R run<R>(R Function() callback) => callback();
}
int use(String key) => 18;
我想使用级联来调用 'run' 方法,该方法应该 return 一个值。
我想做的是:
final ageKey = ScopeKey<int>();
final age = Scope()
..value<int>(ageKey, 18);
.run<int>(() => use(ageKey));
expect(age, equals(18));
注意单个“.”在 'run'.
之前我要做的是:
final ageKey = ScopeKey<int>();
final scope = Scope()..value<int>(ageKey, 18);
final age = scope.run<int>(() => use(ageKey));
expect(age, equals(18));
我的理解是 .. 丢弃 value
调用的结果,取而代之的是 returns Scope
对象。
所以Scope()..value()
应该return一个作用域。
因此我在等电话
Scope()..value().run() => 1
到return 1作为运行的左手操作数应该是Scope
对象。
相反,它会生成一个编译错误:
This expression has a type of 'void' so its value can't be used. Try checking to see if you're using the correct API; there might be a function or call that returns void you didn't expect. Also check type parameters and variables which might also be
这意味着 .运行 正在使用 value
的 return 值。
我误解了什么?
您可以添加括号,以便在您的 Scope
上调用 .run
。
final age = (Scope()..value<int>(ageKey, 18)).run<int>(() => use(ageKey));
使用级联,您目前可以执行如下操作:
class Collection<T> {
List<T> items = [];
@override
String toString() => 'Items($items)';
}
void main() {
final items = Collection<int>()
..items.add(1);
print(items);
}
这只有效,因为 .add
是在 items
而不是 Collection
上调用的。缺点是如果你想在级联调用之后调用 Collection
上的方法,你必须将表达式括在括号中。