2 个稳定版本

1.0.1 2024年8月7日
1.0.0 2024年7月3日

#352 in Rust 模式

Download history 102/week @ 2024-06-27 94/week @ 2024-07-04 60/week @ 2024-07-11 51/week @ 2024-07-18 131/week @ 2024-07-25 616/week @ 2024-08-01 706/week @ 2024-08-08 312/week @ 2024-08-15

1,775 每月下载量
2 crates 中使用

MPL-2.0 许可证

8KB

在方法位置中应用函数。

问题

Rust 中许多功能由方法提供,但有时我们被迫使用某些独立的函数。例如,像 std::str::from_utf8std::sync::Arc::new

let user = fetch_user()
    .await
    .map_err(Error::UserIsLost)?;
let arc = Arc::new(user);
Ok(arc)

我们编写的许多函数也是影响性的,需要我们将某些最终值包裹在 Ok 中。这些因素的组合意味着我们经常不得不将值绑定到名称上,即使我们不想这样做。命名很困难,不良的命名可能会让后来的读者感到困惑。在上面的例子中,谁会从看到名为 arc 的符号中受益?名称应该反映它 是什么,而不是它所包裹的内容。

那么,如果唯一合适的名称就是它已经拥有的名称,比如在“响应”值等情况下呢?这鼓励了“变量遮蔽”,如下所示

let resp = make_request(req).await?;
let resp = foo(resp);
let resp = bar(resp);

此代码对所有权和重构很脆弱。我们不应该必须编写这样的代码。

解决方案

此库提供了一种名为 Apply 的特质,它通过“空白实现”将 apply 方法注入到所有类型中。 apply 允许您通过链式调用将顶层函数与您的其余方法调用一起调用。这样,原始示例变为

fetch_user()
    .await
    .map_err(Error::UserIsLost)?
    .apply(Arc::new)
    .apply(Ok)

啊,美丽,一致的嵌套。而且没有令人困惑的名称。

无运行时依赖