【问题标题】:What does the Value::into method from the serde_json crate do?serde_json crate 中的 Value::into 方法有什么作用?
【发布时间】:2018-03-15 16:13:54
【问题描述】:

这段代码调用val.into() 函数,其中valserde_json::Value 枚举,但我在Rust 文档中找不到into 函数的任何描述。

pub fn parse(&self, s: &str) -> Result<RpcObject, ReadError> {
    let val = serde_json::from_str::<Value>(&s)?;
    if !val.is_object() {
        Err(ReadError::NotObject)
    } else {
        Ok(val.into())
    }
}

【问题讨论】:

    标签: rust serde


    【解决方案1】:

    Intosingle method into 的特征。 Into 是为每个实现了From 的类型实现的:

    impl<T, U> Into<U> for T
    where
        U: From<T>, 
    

    serde_json::Value 实现了许多不同版本的From

    impl From<i8> for Value
    impl From<i16> for Value
    impl From<i32> for Value
    impl From<i64> for Value
    impl From<isize> for Value
    impl From<u8> for Value
    impl From<u16> for Value
    impl From<u32> for Value
    impl From<u64> for Value
    impl From<usize> for Value
    impl From<f32> for Value
    impl From<f64> for Value
    impl From<bool> for Value
    impl From<String> for Value
    impl<'a> From<&'a str> for Value
    impl<'a> From<Cow<'a, str>> for Value
    impl From<Map<String, Value>> for Value
    impl<T: Into<Value>> From<Vec<T>> for Value
    impl<'a, T: Clone + Into<Value>> From<&'a [T]> for Value
    

    这两个特征用于提供不会失败的类型之间的转换。从 Rust 1.34 开始,TryFromTryInto 特征允许错误转换。

    另见:


    精明的读者会注意到,我上面展示的内容实际上允许您将 转换为 serde_json::Value。从技术上讲,原始代码转换为 RpcObject 来自 Value。在您的代码中某处有 impl From&lt;serde_json::Value&gt; for RpcObject,但由于未提供该实现,因此我无法链接到任何有用的文档,但模式是相同的。

    【讨论】:

    • 所以实现From&lt;U&gt; for V 允许我使用val.into::&lt;U&gt;(),其中valV。反过来是真的吗?即实现Into&lt;U&gt; for V 是否允许我使用U::from(val)
    • @saga no;这会导致无限循环。
    • no; that would cause infinite loops. 为什么? val.into::&lt;U&gt;() 不等于 U::from(val) 吗?
    • 是的,代码中有一个From&lt;Value&gt; for RpcObject。该代码属于xi-editor。我不明白的是为什么FromInto 的对称行为会导致无限循环?
    • @saga 因为会有一个完整的From 实现说“去看看Into”和一个完整的Into 实现说“去看看From”。没有地方可以实际实现任何转换逻辑,编译器只会不断地来回循环,试图找出要使用的实现。 Example.
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 2022-12-29
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2015-07-23
    • 2012-07-07
    • 2016-03-27
    相关资源
    最近更新 更多