- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 AngularDart 中有一个类,如下所示:
abstract class Validator {
Map validate(AbstractControl c);
}
仔细观察,这曾经是(在我们添加强模式支持之前):
abstract class Validator {
validate(AbstractControl c);
}
技术上支持返回Future或Map的问题。
我想重构它并使用 FutureOr
正确键入它:
abstract class Validator {
FutureOr<T> validate(AbstractControl c);
}
我可以在运行时使用 is
检查吗? (在DDC和dart2js中)
void runValidator(Validator v) {
var result = v.validate(...);
if (result is Future) {
// async...
} else {
// sync...
}
}
我的想法正确吗?
编辑:如下所述,我的意思是
if (result is Future<T>) {
} else if (result is T) {
}
还有一个问题,validate
是否会匹配这两个 typedef
:
Future<Map> AsyncValidate(AbstractControl c);
Map SyncValidate(AbstractControl c);
最佳答案
是的,你可以这样做result is Future<Map>
。 validate
返回的实际值方法是 Future
或者它不是。函数的静态类型不会影响这一点,因为 FutureOr<Map>
不是一个实际的类,你不能有一个“FutureOr”的对象。它要么是真实的 Future<Map>
或者是 Map
.
对于第二个问题,这取决于“匹配”的含义。您可以使用返回 Map
的方法覆盖该方法。或FutureMap
:
abstract class Validator {
FutureOr<Map> validate(abstractControl c);
}
class AsyncValidator extends Validator {
Future<Map> validate(AbstractControl c) {...}
}
class SyncValidator extends Validator {
Map validate(AbstractControl c) {...}
}
也就是说,您可以使用您提到的函数类型之一作为 Validator.validate
,但不在另一个方向。
typedef FutureOr<Map> Validate(AbstractControl c);
typedef Future<Map> AsyncValidate(AbstractControl c);
typedef Map SyncValidate(AbstractControl c);
Validator v = ...;
Validate f0 = v.validate; // Safe.
AsyncValidate f1 = v.validate; // BAD assignment.
SyncValidate f2 = v.validate; // BAD assignment.
Map syncValidate(AbstractControl c) { ... }
Future<Map> asyncValidate(AbstractControl c) { ... }
v = syncValidate; // Good assignment.
v = asyncValidate; // Good assignment.
在实践中,具体validate
验证器的方法v
可能会分配给 f1
中的一个或f2
,但它的静态类型没有说明是哪一个,因此两者都被认为是错误的赋值。
您应该很少有一个声明为返回 FutureOr
的非抽象方法。 。在大多数情况下,最好总是返回 Future
或非 Future
,并声明该方法。然后你可以随时使用该函数返回 FutureOr
如果需要,但在需要时使用更精确的类型。
关于dart - FutureOr<T> 是否有 Future<T>/<T> 的具体化类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42098554/
可能很明显,但给出这段代码(来自 http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify ): (defn
我有一个空页面,我在其中动态添加元素,我正在尝试使用 Materialize,但我遇到了图形问题... 我已按照“http://materializecss.com/”上的不同教程使用正确的方法添加元
我正在尝试定义关系 callto_status(Goal, Status)总是成功,根据调用Goal的结果统一Status (换句话说,我想实现 call_with_inference_limit/3
我在为我的网站设置包含自动完成 (https://materializecss.com/navbar.html) 的物化搜索栏 (https://materializecss.com/autocomp
我有一个即将到来的逻辑考试,并且一直在学习我类(class)中的一些过去的论文。我遇到了一个关于物化的问题,并将其发布在下面; 用具体化来表示变量 B 的性质 取值为 1 或 8。 在阅读了一些资源并
我有一个 Laravel 项目,其中一个页面有 5 个模态(MaterializeCSS),每个模态都有一个表单。当我提交表单并遇到任何验证错误时,模式必须重新打开。 我可以通过运行以下代码来实现这一
我是一名优秀的程序员,十分优秀!