gpt4 book ai didi

rust - 如何处理 Option> 和 Option<&T>

转载 作者:行者123 更新时间:2023-12-03 11:41:56 25 4
gpt4 key购买 nike

在示例中,我们假设我们有两个代码,它们有自己的边界并单独测试。

代码 1 返回类型 Option<Rc<RefCell<T>>> 代码 2 必须消耗 &T

我对以下示例 playground 有疑问。

use std::cell::RefCell;
use std::rc::Rc;

// Code 2
fn action(data_1: Option<&i32>, data_2: Option<&i32>) {
println!("data_1:{:?}, data_2:{:?}", data_1, data_2);
}

fn main() {
// Code 1
let data_1 = Some(Rc::new(RefCell::new(2)));
let data_2 = Some(Rc::new(RefCell::new(5)));

let ref_data_1 = data_1.as_ref().map(|r| r.borrow());
let ref_data_2 = data_2.as_ref().map(|r| r.borrow());

action(ref_data_1, ref_data_2); // Error: mismatched types
}

该示例失败,因为找到 Ref<T> 和预期 &T 之间的类型不匹配。
我建立的唯一方法是将 Option<&i32> 更改为 Option<Ref<i32>> ,但这会破坏 代码 2 的接口(interface)。

最佳答案

您可以更改 action接受Option<&i32>的函数或 Option<Ref<i32>>通过使用带有 Deref<Target = i32> 的通用参数bound,这两种类型都满足:

use std::ops::Deref;

fn action<T>(data_1: Option<T>, data_2: Option<T>)
where
T: Deref<Target = i32>,
{
println!("data_1:{:?}, data_2:{:?}", data_1.as_deref(), data_2.as_deref());
}

如果您不能或不想更改 action 的签名,那么您可以调用 as_deref()当你传入参数时:
action(ref_data_1.as_deref(), ref_data_2.as_deref());

关于rust - 如何处理 Option<Ref<T>> 和 Option<&T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62069043/

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