rust - 如何调用为 &str 实现的关联函数?

标签 rust serde

我正在尝试编写一个自定义的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/

相关文章:

json - 如何编写 Serde Visitor 将字符串数组转换为 Vec<Vec<f64>>?

rust - 如何使用 Serde 在序列化期间转换字段?

visual-studio-code - 如何从 VS Code 而不是通过命令行创建一个新的 Rust 项目?

rust - 如何从 serde_yaml::Value 获取嵌套属性?

rust - 在编译时使用 serde_json 反序列化文件

rust - 什么时候在方法中使用 self、&self 和 &mut self?

rust - 使用 Append(false) 写入文件无法按预期工作

unit-testing - 如何在 Rust 中模拟特定方法而不是所有方法?

rust - Rust Serde反序列化混合数组

compiler-errors - 找到预期的 XYZ ()