gpt4 book ai didi

rust - 如何使 Result 的内在值 must_use

转载 作者:行者123 更新时间:2023-12-05 02:30:24 27 4
gpt4 key购买 nike

我可以使用 #[must_use]用于将函数标记为具有必须使用或显式忽略的返回值的属性:

#[must_use]
fn plain() -> i32 {
1
}

fn main() {
plain(); // warning
}

但是,如果我想更改我的函数,它现在返回一个 Result ,我不能这样做:

#[must_use]
fn result() -> Result<i32, ()> {
Ok(1)
}

fn main() {
result().unwrap();
}

因为调用.unwrap()算作“使用”,#[must_use]属性应用于整个 Result .

有没有办法让#[must_use]也适用于内部类型?本质上,我想确保 i32不会不小心被分号“吃掉”。

我有额外的限制,我不能改变这个函数的公共(public) API,所以我不能让它返回 Result<MustUse<i32>, ()>或类似的东西。

最佳答案

您不能通过直接将自己的注释添加到 Result 来做到这一点, 但你可以用一个新类型简单地做到这一点:

#[must_use]
#[repr(transparent)]
pub struct MustUse<T>(T);

impl<T> From<T> for MustUse<T> {
fn from(v: T) -> Self {
Self(v)
}
}

impl<T> MustUse<T> {
#[must_use]
fn into_inner(self) -> T {
self.0
}
}

现在,给出这个声明:

fn result() -> Result<MustUse<i32>, ()> {
Ok(1.into())
}

以下所有情况都会导致警告:

  • result();警告因为 Result<_, _>必须使用。
  • result().unwrap();警告因为 MustUse<_>必须使用。
  • result().unwrap().into_inner();警告因为 MustUse<_>::into_inner()必须使用。

(请注意,您可以通过调用 Result 的一个不同的、非必须使用的方法来绕过警告,例如 result().ok(),但无论您做什么都是如此。)

关于rust - 如何使 Result 的内在值 must_use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71873348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com