gpt4 book ai didi

rust - 如何将受特征限制的类型传递给Serde的deserialize_with?

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

应该将满足MyTrait的类型传递给deserialize_data指定的deserialize_with。这是我的sample code:

use serde::{Deserialize, Deserializer}; // 1.0.117
use serde_json; // 1.0.59

type Item = Result<String, Box<dyn std::error::Error + Send + Sync>>;
pub trait MyTrait {
fn method(ind: &str) -> Item;
}

#[derive(Deserialize)]
pub struct S<T>
where
T: MyTrait + ?Sized, // intend to pass a type T satisfying `MyTrait` to function `deserialize_data`,
{
#[serde(deserialize_with = "deserialize_data")]
//#[serde(bound( deserialize = "T: MyTrait, for<'de2> T: Deserialize<'de2>" ))]
pub data: String,
}

fn deserialize_data<'de, D, T>(d: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let ind = <&str>::deserialize(d).unwrap();
match T::method(ind) {
Ok(data) => Ok(data),
Err(e) => Err(serde::de::Error::custom(format_args!("invalid type."))),
}
}

struct A;
impl MyTrait for A {
fn method(_ind: &str) -> Item {
// to make it simple, return constant
Ok("method".to_string())
}
}

fn main() {
let s = r#"{"data": "string"}"#;
let ob: S<A> = serde_json::from_str(s).unwrap();
}
编译器提示:
error[E0392]: parameter `T` is never used
--> src/main.rs:10:14
|
10 | pub struct S<T>
| ^ unused parameter
|
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
我确实使用 T,而 PhantomData并没有太大帮助。
一种明显的方式可能是使用 struct A及其实现的方法作为 crate 或导入它们的东西。不幸的是,这不适用于我的情况,因此我寻求将结构类型传递给 deserialize_data并实现该目标。

最佳答案

要编译代码,您需要:

  • T中使用struct S<T>,例如与PhantomData一起使用。
  • 使用turbofish运算符T明确将deserialize_data传递给::<>
  • 将适当的特征范围添加到T中的deserialize_data()泛型类型,例如MyTrait

  • 例如( playground):
    #[derive(Deserialize)]
    pub struct S<T>
    where
    T: MyTrait + ?Sized,
    {
    #[serde(deserialize_with = "deserialize_data::<_, T>")]
    pub data: String,
    marker: std::marker::PhantomData<T>,
    }

    fn deserialize_data<'de, D, T>(d: D) -> Result<String, D::Error>
    where
    D: Deserializer<'de>,
    T: MyTrait + ?Sized,
    {
    // ...
    }

    关于rust - 如何将受特征限制的类型传递给Serde的deserialize_with?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65078247/

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