Flutter 的 Either 模块中的 Left 和 Right 是什么?
What is Left and Right in the Either module in Flutter?
我正在查看一些如下所示的 Flutter 代码:
try {
return Right(_doSomethingAndReturnSingleValue());
} on CustomException {
return Left(CustomException());
}
Left
和 Right
来自核心 either.dart
包,这是代码:
class Left<L, R> extends Either<L, R> {
final L _l;
const Left(this._l);
L get value => _l;
@override B fold<B>(B ifLeft(L l), B ifRight(R r)) => ifLeft(_l);
@override bool operator ==(other) => other is Left && other._l == _l;
@override int get hashCode => _l.hashCode;
}
class Right<L, R> extends Either<L, R> {
final R _r;
const Right(this._r);
R get value => _r;
@override B fold<B>(B ifLeft(L l), B ifRight(R r)) => ifRight(_r);
@override bool operator ==(other) => other is Right && other._r == _r;
@override int get hashCode => _r.hashCode;
}
我真的很难理解这个逻辑应该做什么。
谁能帮我理解 Left()
和 Right()
在 Dart 中的作用?
Left 和 Right 是两个通用的 classes 继承自同一父级,它们做的事情几乎相同。主要区别在于 fold 方法的实现。左边 class 调用 ifLeft 回调,右边 class 调用 ifRight 回调。
例如:
Either<CustomException, String> getSomething() {
try {
return Right(_doSomethingAndReturnSingleValue());
} on CustomException {
return Left(CustomException());
}
}
无论发生什么,上面的函数都会 return 要么是一个 的对象要么是 CustomException (Means Left) 要么是一个 的对象要么是字符串(表示正确).
现在,如果您使用如下函数:
final eitherData = getSomething();
您将得到一个对象(左对象或右对象)。除了检查 eitherData 是 Left 还是 Right 类型,您可以调用该对象的 fold 方法,如下所示:
eitherData.fold<Widget>(
(err) => Text('Error Happened: $err'), // ifLeft callback
(data) => Text('Got data: $data'), // ifRight callback
)
正如我之前提到的,根据对象类型会触发相应的回调,您可以优雅地处理成功和错误情况,而无需编写任何 if else 语句或类型检查。
我正在查看一些如下所示的 Flutter 代码:
try {
return Right(_doSomethingAndReturnSingleValue());
} on CustomException {
return Left(CustomException());
}
Left
和 Right
来自核心 either.dart
包,这是代码:
class Left<L, R> extends Either<L, R> {
final L _l;
const Left(this._l);
L get value => _l;
@override B fold<B>(B ifLeft(L l), B ifRight(R r)) => ifLeft(_l);
@override bool operator ==(other) => other is Left && other._l == _l;
@override int get hashCode => _l.hashCode;
}
class Right<L, R> extends Either<L, R> {
final R _r;
const Right(this._r);
R get value => _r;
@override B fold<B>(B ifLeft(L l), B ifRight(R r)) => ifRight(_r);
@override bool operator ==(other) => other is Right && other._r == _r;
@override int get hashCode => _r.hashCode;
}
我真的很难理解这个逻辑应该做什么。
谁能帮我理解 Left()
和 Right()
在 Dart 中的作用?
Left 和 Right 是两个通用的 classes 继承自同一父级,它们做的事情几乎相同。主要区别在于 fold 方法的实现。左边 class 调用 ifLeft 回调,右边 class 调用 ifRight 回调。
例如:
Either<CustomException, String> getSomething() {
try {
return Right(_doSomethingAndReturnSingleValue());
} on CustomException {
return Left(CustomException());
}
}
无论发生什么,上面的函数都会 return 要么是一个 的对象要么是 CustomException (Means Left) 要么是一个 的对象要么是字符串(表示正确).
现在,如果您使用如下函数:
final eitherData = getSomething();
您将得到一个对象(左对象或右对象)。除了检查 eitherData 是 Left 还是 Right 类型,您可以调用该对象的 fold 方法,如下所示:
eitherData.fold<Widget>(
(err) => Text('Error Happened: $err'), // ifLeft callback
(data) => Text('Got data: $data'), // ifRight callback
)
正如我之前提到的,根据对象类型会触发相应的回调,您可以优雅地处理成功和错误情况,而无需编写任何 if else 语句或类型检查。