result_option

result_option 是一个简单的 Dart 库,用于实现 ResultOption 类型。它受到 Rust 的启发,利用 Dart 3 的新模式匹配功能和 sealed class 的穷尽 switch 机制,尽可能地提供接近 Rust 的 Result/Option 体验,而无需实现 Rust 提供的所有实用方法。

这个包目前还在开发中。我只是在有空的时候添加内容,而且目前它的功能仅限于我为我正在使用的项目所需要的部分。我希望将来能在这里加入一些 Rust 的实用方法,例如 mapfilter,但我目前不需要它们。

入门

将依赖添加到你的 Dart/Flutter 项目的 pubspec.yaml 文件中

dependencies:
  result_option: ^1.0.0

或通过 git

dependencies:
  result_option:
    git: https://github.com/zajrik/result_option.git

然后运行 dart pub getflutter pub get

用法

// Assume getUser() returns some sort of User object
Result<User, String> user = await getUser(id: 12345);

if (user case Err(value: String error)) {
  print('Error retrieving user: $error');
  return;
}

// Assume the User object has an email field of type Option<String>
Option<String> email = user.unwrap().email;

if (email case Some(value: String address)) {
  print('User email: $address');
} else {
  print('User has no email set.');
}

// Alternative to the above using a switch expression for pattern matching
print(switch (email) {
  Some(value: String address) => 'User email: $address',
  None() => 'User has no email set.'
});

// Pattern matching with switch is exhaustive for Result and Option, so the compiler
// will give you warnings/errors to make sure you're providing cases for all potential
// values for Ok()/Some(), either directly or via a default case, and for Err()/None(),
// again either directly or via a default case

附加信息

这个库的编写很大程度上是因为我不喜欢其他具有类似目标的库利用高阶函数来实现伪模式匹配的方式。现在 Dart 拥有真正的模式匹配,我想使用一种能利用它的库,但我找不到真正符合我需求,也符合我对 Rust 实现的欣赏的库。

GitHub

查看 Github