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

Rust API数据发送时遭遇借用错误与值移动问题求助

解决Rust API中的借用与值移动问题

错误分析与修复方案

1. 临时值提前释放(E0716)

链式调用里coordinate.method(...).unwrap()创建的临时对象,生命周期仅到当前语句末尾,但后续.send().await会异步挂起,导致临时值在被借用时就被释放。

修复方式:把method调用后的结果用let绑定单独存储,延长其生命周期。

2. 无法从Json包装中移出值(E0507)

web::Json<Region>是智能指针类型,直接访问内部字段会触发值移动,但Vec<U256>未实现Copy trait,导致移动操作失败。

修复方式:通过into_inner()方法提取出内部的Region实例,获取所有权后再使用其字段。

修改后的完整代码

#[post("/send")]
async fn send(field: web::Json<Region>, data: web::Data<Datum>) -> impl Responder {
    let address = data.address;
    let provider = Provider::try_from(&data.provider).unwrap();
    let provider = Arc::new(provider);
    let coordinate = Coordinate::new(address, provider);
    
    // 提取Json内部的Region实例,获取所有权
    let region_data = field.into_inner();
    // 将method调用结果绑定到变量,延长生命周期
    let tx = coordinate
        .method::<_, (Vec<U256>, U256)>("send", (region_data.region, region_data.price))
        .unwrap();
    
    let response = tx.send().await;

    HttpResponse::Created()
        .content_type(ContentType::json())
        .body(response.unwrap().to_string())
}

额外说明

  • 若后续还需使用原field,可改用&field.region和&field.price(需合约方法支持引用参数),或对字段执行clone操作替代into_inner()。
  • 异步编程中应避免直接在链式调用里使用临时对象,通过显式变量绑定控制生命周期是解决这类问题的通用方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:33:17