2 个稳定版本
1.0.1 | 2024年8月7日 |
---|---|
1.0.0 | 2024年7月3日 |
#352 in Rust 模式
1,775 每月下载量
在 2 crates 中使用
8KB
在方法位置中应用函数。
问题
Rust 中许多功能由方法提供,但有时我们被迫使用某些独立的函数。例如,像 std::str::from_utf8
或 std::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)
啊,美丽,一致的嵌套。而且没有令人困惑的名称。