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());
    }

LeftRight 来自核心 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 语句或类型检查。