You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Result<T, E>简便地获取Result<&T, E>?

实现Result<&T, E>的转换方法

如果你想用Result<T, E>得到Result<&T, E>,而非as_ref()返回的Result<&T, &E>,可以根据E的类型特性选择不同方案:

  • 当E实现Copy trait时:
    先通过as_ref()拿到带引用的Result,再用map_err解引用Err部分直接复制出E:

    let original: Result<T, E> = Ok(/* 你的值 */);
    let desired: Result<&T, E> = original.as_ref().map_err(|&err| err);
    
  • 当E实现Clone trait时:
    同样先调用as_ref(),再通过map_err克隆Err部分获取所有权:

    let original: Result<T, E> = Err(/* 你的错误值 */);
    let desired: Result<&T, E> = original.as_ref().map_err(|err| err.clone());
    
  • 手动模式匹配(通用方案):
    不管E是否实现Copy/Clone,都可以直接对原Result的引用做模式匹配,按需构造目标Result:

    let original: Result<T, E> = /* 你的Result实例 */;
    let desired: Result<&T, E> = match &original {
        Ok(val) => Ok(val),
        Err(err) => Err(err.clone()), // 若E不可Clone,可改为移动原Err(但原Result会被消费)
    };
    // 若允许消费原Result且E不可Clone:
    let desired: Result<&T, E> = original.map(|val| &val).map_err(|err| err);
    // 注意:这种情况原Result会被移动,Ok部分的引用生命周期绑定到原Result,需确保原Result存活足够久
    

要注意的是,想持有&T的同时拥有E的所有权,要么E支持复制/克隆,要么得消费原Result转移E的所有权——毕竟原Result的Err部分要么被引用,要么被转移,二者不可兼得。

内容的提问来源于stack exchange,提问作者progquester

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:48:15