繁体   English   中英

为类型引用实现特征时返回对临时值的引用时出错

[英]Error returning reference to a temporary value when implementing a trait for a type reference

我正在尝试实现一个简单的特征,它返回对某些数据( GetData )的引用。 由于不同的原因,我需要实现这个特征以引用我的类型( &Base<T> )。 我还想要一个拥有基本类型并实现特征的包装器类型。

简化的示例如下所示:

    // Trait
    trait GetData<T> {
      fn get_data(&self) -> &T;
    }
    
    // Base type
    struct Base<T> {
      pub data: T,
    }
    
    impl<T> GetData<T> for &Base<T> {
      fn get_data(&self) -> &T {
        &self.data
      }
    }
    
    // Wrapper type owning a Base type
    struct Wrapper<T> {
      base: Base<T>,
      //...
    }
    
    impl<T> GetData<T> for &Wrapper<T> {
      fn get_data(&self) -> &T {
        (&self.base).get_data()  // E0515: returns a value referencing data owned by the current function 
        //&self.base.data        // This works fine!
      }
    }

&Wrapper<T>实现get_data时,我收到从 function 返回临时值的错误。 据我了解&self.base是由GetData::get_data借用的。 我不知道如何解决它。 到目前为止,我所有添加显式生命周期的尝试都没有奏效。

问题在于:

    impl<T> GetData<T> for &Base<T> {
      fn get_data(&self) -> &T {
        &self.data
      }
    }

现在老实说,我不知道你为什么要费心只为&Base实现而不是只为Base实现。 但这就是问题的原因,因为 Base 的生命周期和 self 的生命周期不同,而你的self&&Base<T>

这意味着:

      fn get_data(&self) -> &T {
        (&self.base).get_data()  // E0515: returns a value referencing data owned by the current function 
        //&self.base.data        // This works fine!
      }

结果的生命周期是&self.base的生命周期,它纯粹是 function 的本地生命周期,而不是self的预期生命周期。

如果你

    impl<T> GetData<T> for Base<T> {
      fn get_data(&self) -> &T {
        &self.data
      }
    }

然后一切都开箱即用。

不禁想到整个事情都带有 OO 思维的味道, GetData特征散发着 Java/C# 接口的味道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM