我正在尝试编写一个自定义的Deserialize
实现,它可以对我的枚举执行不区分大小写的反序列化:
use serde::{Deserialize, Deserializer}; // 1.0.120
use serde_json; // 1.0.61
#[derive(Debug, PartialEq)]
enum MyEnum {
Foo,
Bar,
}
// Implements case-insensitive deserialization of node types using from_str above
impl<'de> Deserialize<'de> for MyEnum {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let v = String::deserialize(deserializer)?;
match v.to_ascii_lowercase().as_ref() {
"foo" => Ok(MyEnum::Foo),
"bar" => Ok(MyEnum::Bar),
_ => Err(serde::de::Error::custom("invalid value")),
}
}
}
这可行,但会导致两次分配:一次将输入值放入 String
中,另一次将 String
转换为大写。我不需要第一个,因为 serde 提供了 Deserialize for &str
的实现。 .我怎么调用它?
这不起作用:
let v: &str = &str::deserialize(deserializer)?
因为:
error[E0277]: the trait bound `str: Deserialize<'_>` is not satisfied
--> src/lib.rs:16:24
|
16 | let v: &str = &str::deserialize(deserializer)?;
| ^^^^^^^^^^^^^^^^ the trait `Deserialize<'_>` is not implemented for `str`
|
::: /playground/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.120/src/de/mod.rs:540:12
|
540 | D: Deserializer<'de>;
| ----------------- required by this bound in `serde::Deserialize::deserialize`
|
= help: the following implementations were found:
<&'a str as Deserialize<'de>>
(除了关于 str 大小的其他错误未知)。
它甚至告诉我 &'a str
有一个实现,但我不确定使用什么语法来调用它。
最佳答案
harmic 通过输出类型提供了一个"dispatch",只要结果没有歧义,您就可以调用特征本身的方法。
或者,您可以使用“turbofish”来强制进行类型评估:正如错误告诉您的那样,&str::deserialize(deserializer)?
真正解析为 &(str::deserialize(deserializer)?)
. <&str>::deserialize(deserializer)?
将强制调用发生在 &str
相反,并避免了显式输入结果的需要。
关于rust - 如何调用为 &str 实现的关联函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65988743/