【问题标题】:Understanding the Debug implementation for Vec<T>了解 Vec<T> 的调试实现
【发布时间】:2015-07-27 12:21:04
【问题描述】:

尝试为自定义类型实现 Debug 特征时,我偶然发现了 Vec&lt;T&gt; 的实现。我很难理解它是如何工作的。

实现如下:

impl<T: fmt::Debug> fmt::Debug for Vec<T> {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        fmt::Debug::fmt(&**self, f)
    }
}

我知道它为其他类型调用了fmt 实现。我无法理解的是它是什么类型。我试图在another question 的帮助下解决这个问题,并在implementations of Debug 中搜索看起来合适的东西(可能类似于&amp;[T]),但没有成功。

&amp;**self 在这种情况下的确切含义是什么?正在调用Debug 的什么实现?

【问题讨论】:

    标签: reference rust dereference


    【解决方案1】:

    在这种情况下,我发现让编译器告诉你类型是什么很有用。只需引起类型错误,让编译器诊断为您完成。最简单的方法是尝试将您的项目分配给() 类型的东西:

    fn main() {
        let v = &vec![1,2,3];
        let () = v;
        let () = &**v;
    }
    

    错误是:

    <anon>:3:9: 3:11 error: mismatched types:
     expected `&collections::vec::Vec<_>`,
        found `()`
    (expected &-ptr,
        found ()) [E0308]
    <anon>:3     let () = v;
                     ^~
    <anon>:4:9: 4:11 error: mismatched types:
     expected `&[_]`,
        found `()`
    (expected &-ptr,
        found ()) [E0308]
    <anon>:4     let () = &**v;
                     ^~
    

    因此v&amp;collections::vec::Vec&lt;_&gt;&amp;**v&amp;[_]

    更详细的,Vec 有这个:

    impl<T> Deref for Vec<T> {
        type Target = [T];
        // ...
    }
    

    因此,我们取消引用一次以从 &amp;Vec&lt;T&gt; 转到 Vec&lt;T&gt;,再次取消引用以获取 [T],然后引用一次以获取 &amp;[T]

    [T] 有这个:

    impl<T> Debug for [T] {
        fn fmt(&self, ...) ...;
    }
    

    然而,当搜索合适的方法来调用时,Rust 会automatically attempt to dereference 目标。这意味着我们可以从&amp;[T] 中找到[T] 上的方法。

    由于corrected by Francis GagnéDebug::fmt 采用&amp;self,因此直接使用&amp;[T] 调用它会找到匹配的实现。无需任何自动引用或取消引用。

    【讨论】:

    • 谢谢!我只是想念一件事:我找到了[T] 的实现,但没有找到&amp;[T] 的实现,是后者被调用吗?为什么?
    • @toro2k 我对此添加了更多内容。如果有帮助,请告诉我!
    • 我不认为有任何自动取消引用(或自动引用),因为fmt::Debug::fmt() 通过引用获取self,即它需要一个&amp;[T],并且它给出了一个@987654348 @.
    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2018-06-17
    • 2020-01-22
    相关资源
    最近更新 更多