Memory management 我是否正确使用了继承、借用的指针和显式生命周期注释?

Memory management 我是否正确使用了继承、借用的指针和显式生命周期注释?,memory-management,rust,Memory Management,Rust,我正在学习锈迹,来自一个几乎完全是垃圾收集的背景。因此,我想确保在编写第一个程序时,我是正确的 Rust网站上的教程说,我应该怀疑使用的指针不是&。考虑到这一点,以下是我在我的小类层次结构中得到的结果(更改名称以保护无辜)。要点是,我有两个不同的实体,比如说Derived1和Derived2,它们共享一些行为和结构。我将公共数据放入Foostruct,将公共行为放入Fooishtrait: struct Foo<'a> { name: &'a str,

我正在学习锈迹,来自一个几乎完全是垃圾收集的背景。因此,我想确保在编写第一个程序时,我是正确的

Rust网站上的教程说,我应该怀疑使用的指针不是
&
。考虑到这一点,以下是我在我的小类层次结构中得到的结果(更改名称以保护无辜)。要点是,我有两个不同的实体,比如说
Derived1
Derived2
,它们共享一些行为和结构。我将公共数据放入
Foo
struct,将公共行为放入
Fooish
trait:

struct Foo<'a> {
    name:       &'a str,
    an_array:   &'a [AnEnumType],
    /* etc. */
}

struct Derived1<'a> {
    foo:         &'a Foo<'a>,
    other_stuff: &'a str,
}
struct Derived2<'a> {
    foo: &'a Foo<'a>,
    /* etc. */
}

trait Fooish<'a> {
    fn new(foo: &'a Foo<'a>) -> Self;
    /* etc. */
}

impl<'a> Fooish<'a> for Derived1<'a> {
    fn new(foo: &'a Foo<'a>) -> Derived1<'a> {
        Derived1 { foo: foo, other_stuff: "bar" }
    }
    /* etc. */
}

/* and so forth for Derived2 */
structfoo{
福:&阿福{
fn新(foo:&a foo Fooish{
fn新(foo:&a foo{
Derived1{foo:foo,其他东西:“酒吧”}
}
/*等等*/
}
/*对于Derived2,依此类推*/
我的问题是:

  • 我是不是有点习惯性地“在锈迹中继承遗产”
  • 在这里使用
    &
    指针作为结构字段是否正确?(例如字符串数据和数组字段,其大小因实例而异?对于
    派生的
    中的
    Foo
    如何?)
  • 如果#2的答案是“是”,那么我需要显式的生命周期注释,对吗
  • 在我的示例中,到处都有如此多的生命周期注释是常见的吗

  • 谢谢!

    我想说这根本不是惯用方法,但有时有些任务需要脱离惯用方法,只是不清楚是否真的是这样

    我建议您不要使用OO语言中的思想,这些思想是在类和继承方面操作的——它们在Rust中无法正常工作。相反,您应该从所有权的角度考虑您的数据:问自己一个问题,给定的结构是否应该拥有数据?换句话说,数据是否自然地属于该结构,或者可以是在某处单独使用

    如果您将此推理应用于您的结构:

    struct Foo<'a> {
        name:       &'a str,
        an_array:   &'a [AnEnumType],
        /* etc. */
    }
    
    struct Derived1<'a> {
        foo:         &'a Foo<'a>,
        other_stuff: &'a str,
    }
    
    struct Derived2<'a> {
        foo: &'a Foo<'a>,
        /* etc. */
    }
    
    请注意,
    Derived*
    结构现在包括
    Foo

    至于字符串和数组(实际上是字符串切片和数组切片),那么是的,如果你想将它们保存在结构中,你必须使用生命周期注释。然而,这种情况并不经常发生,而且,基于所有权设计结构通常有助于决定这应该是一个切片还是一个动态分配的
    字符串
    Vec
    。这其中有一个解释当您需要使用已拥有的字符串和需要切片时,同样的道理适用于<代码>和[t] <代码> />代码> vc>代码>。简而言之,如果您的结构拥有字符串/数组,则必须使用<代码>字符串< /代码> />代码> vc>代码>。否则,请考虑使用切片。

    struct Foo<'a> {
        name:       &'a str,
        an_array:   &'a [AnEnumType],
        /* etc. */
    }
    
    struct Derived1<'a> {
        foo:         Foo<'a>
        other_stuff: &'a str,
    }
    
    struct Derived2<'a> {
        foo: Foo<'a>,
        /* etc. */
    }