有没有办法在这里忽略特质的一生?

克里斯多夫

我再次与一辈子战斗。或实际上,我有点打赢了比赛,但我不确定结果是否是处理该问题的预期方式。

假设我有一个具有两个生命周期的结构:Inner<'a, 'b>现在,我想编写一个定义new(inner: &Inner) -> Self方法的特征。实现者应该可以自由地在Inner内部存储引用,并定义其他方法以对其进行处理。

我想出了这个(可行!),但是我有几个问题

struct Inner<'a, 'b>{
    foo: &'a str,
    bar: &'b str
}

trait Worker<'data, 'a, 'b> {
    fn new (inner: &'data Inner<'a, 'b>) -> Self;
    fn work_with_inner () { println!("works on inner");}
}

struct SomeWorker<'inner, 'a:'inner, 'b:'inner> {
    inner: &'inner Inner<'a, 'b>
}

impl<'data, 'a, 'b> Worker<'data, 'a, 'b> for SomeWorker<'data, 'a, 'b> {
    fn new (inner: &'data Inner<'a, 'b>) -> Self {
        SomeWorker {
            inner: inner
        }
    }
}

fn main () {
}

围栏:http : //is.gd/A3ol4w

  1. 就使用寿命而言,这可以简化吗?特别是,我想知道该特性是否真的需要定义所有这些生存期,或者是否有办法仅在结构上定义它们?

  2. 如果无法忽略trait的生存期,是否意味着最好的做法是指定trait上所有可能的生存期,以使实现者具有最大的灵活性?我的意思是,如果该SomeWorker结构不想存储对的引用Inner,则整个过程(包括特征)可能会更加简单。

瞧,根本没有生命。

struct Inner<'a, 'b>{
    foo: &'a str,
    bar: &'b str
}

trait Worker {
    fn new (inner: &Inner) -> Self;
    fn work_with_inner () { println!("works on inner");}
}

struct SomeWorker;

impl Worker for SomeWorker {
    fn new (inner: &Inner) -> Self {
        SomeWorker
    }
}

fn main () {
}

游戏围栏:http//is.gd/NzigjX

这就是为什么我要问自己,作为特征作者,我是否应该假设所有引用的方法最终都可能被特征实现者存储在字段中,因此我需要在特征上指定所有生存期,以使其成为可能对于实施者。

Shepmaster

没有一种万能的解决方案。作为特质作者,您必须考虑自己想做什么和想要实现什么。

如果要具有将值的生存期与结构的生存期参数相关联的功能,则必须将生存期放在特征上。通常这样做是因为你的特质有预期与寿命相同的值运行多个方法。这可能类似于getter / setter对。在我编写的一些代码中,我传递了&str我保留了一段时间的引用,然后才“完成”它们。如果出于任何原因需要存储引用,则必须在特征上具有生命周期。

在您的情况下,您有一个构造函数方法,如果该结构确实需要,则需要知道生存期。如果该功能确实与众不同,则可以将该功能与其余特征分开。在您的示例中,该work_with_inner方法不接受self参数,因此非常不同。如果您使用过self但不需要与from的生命周期进行交互Inner,它仍然可以帮助您:

trait WorkerBuilder<'a, 'b> {
    fn new(inner: Inner<'a, 'b>) -> Self;
}

trait Worker {
    fn do_work(&self);
}

#[derive(Debug)]
struct Inner<'a, 'b>{
    foo: &'a str,
    bar: &'b str,
}

// This does track `Inner`
#[derive(Debug)]
struct SomeWorker<'a, 'b>(Inner<'a, 'b>);

impl<'a, 'b> WorkerBuilder<'a, 'b> for SomeWorker<'a, 'b> {
    fn new(inner: Inner<'a, 'b>) -> SomeWorker<'a, 'b> {
        SomeWorker(inner)
    }
}

impl<'a, 'b> Worker for SomeWorker<'a, 'b> {
    fn do_work(&self) { println!("Doing work, {:?}", self.0) }
}

// This doesn't track `Inner`
#[derive(Debug)]
struct DumbWorker;

impl<'a, 'b> WorkerBuilder<'a, 'b> for DumbWorker {
    fn new(inner: Inner<'a, 'b>) -> DumbWorker {
        DumbWorker
    }
}

fn main () {}

您会看到我还应用了一件可以减少生命周期的事情如果您的结构只是引用(或引用和其他小Copy类型),则无需将引用传递给结构。引用是可复制的,并且跟踪包含结构的生存期没有用。


社论-我不认为“构造函数”方法通常在特征中有用。您通常希望提供不同的集合或参数,这就是为什么首先要使用不同类型的原因。也许您的真实代码在特征中使用的不是构造函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有办法在这里使用lambda?

来自分类Dev

Excel-有没有办法告诉Excel我的工作表在这里结束

来自分类Dev

有没有一种方法可以简化此代码?Visual Basic在这里

来自分类Dev

有没有办法忽略uTest中的测试?

来自分类Dev

有没有办法忽略hg责备的提交?

来自分类Dev

有没有办法忽略Gson中的JsonSyntaxException

来自分类Dev

有没有办法忽略uTest中的测试?

来自分类Dev

有没有在这里使用可选没有在三个地方返回“NA”一个更清洁的方式?

来自分类Dev

在这里加入似乎没有必要

来自分类Dev

为什么 sharedPreference 没有保存在这里?

来自分类Dev

SQL - 如何获取列中的唯一值(distinct 在这里没有帮助)

来自分类Dev

R从图片创建数据框-有没有比我在这里做的更好的方法?

来自分类Dev

在这种情况下,有没有办法避免条件结构?

来自分类Dev

有没有办法回答(或忽略)所有y / n提示“ y”?

来自分类Dev

有没有办法忽略未使用的未定义引用?

来自分类Dev

有没有办法告诉WinDbg忽略程序断点?

来自分类Dev

有没有办法让py.test忽略在子进程上引发的SystemExit?

来自分类Dev

有没有办法忽略Google游戏服务中的成就?

来自分类Dev

有没有办法只执行doctest,而忽略打印函数调用?

来自分类Dev

有没有办法回头忽略正则表达式中的特定字母?

来自分类Dev

Django:有没有办法过滤模型并忽略存储的连字符?

来自分类Dev

有没有办法设置导入的库,使其忽略我的自定义CSS?

来自分类Dev

有没有办法在键入时忽略/取消特定的鱼壳完成?

来自分类Dev

在使用c ++读取文件时,有没有办法忽略文件字符的结尾?

来自分类Dev

有没有办法用get_multi忽略无效键?

来自分类Dev

有没有办法忽略Google游戏服务中的成就?

来自分类Dev

火力基地。有没有办法忽略在iOS上调用childAdded?

来自分类Dev

有没有办法让git忽略您的HOME设置?

来自分类Dev

有没有办法只执行doctest,而忽略打印函数调用?

Related 相关文章

  1. 1

    有没有办法在这里使用lambda?

  2. 2

    Excel-有没有办法告诉Excel我的工作表在这里结束

  3. 3

    有没有一种方法可以简化此代码?Visual Basic在这里

  4. 4

    有没有办法忽略uTest中的测试?

  5. 5

    有没有办法忽略hg责备的提交?

  6. 6

    有没有办法忽略Gson中的JsonSyntaxException

  7. 7

    有没有办法忽略uTest中的测试?

  8. 8

    有没有在这里使用可选没有在三个地方返回“NA”一个更清洁的方式?

  9. 9

    在这里加入似乎没有必要

  10. 10

    为什么 sharedPreference 没有保存在这里?

  11. 11

    SQL - 如何获取列中的唯一值(distinct 在这里没有帮助)

  12. 12

    R从图片创建数据框-有没有比我在这里做的更好的方法?

  13. 13

    在这种情况下,有没有办法避免条件结构?

  14. 14

    有没有办法回答(或忽略)所有y / n提示“ y”?

  15. 15

    有没有办法忽略未使用的未定义引用?

  16. 16

    有没有办法告诉WinDbg忽略程序断点?

  17. 17

    有没有办法让py.test忽略在子进程上引发的SystemExit?

  18. 18

    有没有办法忽略Google游戏服务中的成就?

  19. 19

    有没有办法只执行doctest,而忽略打印函数调用?

  20. 20

    有没有办法回头忽略正则表达式中的特定字母?

  21. 21

    Django:有没有办法过滤模型并忽略存储的连字符?

  22. 22

    有没有办法设置导入的库,使其忽略我的自定义CSS?

  23. 23

    有没有办法在键入时忽略/取消特定的鱼壳完成?

  24. 24

    在使用c ++读取文件时,有没有办法忽略文件字符的结尾?

  25. 25

    有没有办法用get_multi忽略无效键?

  26. 26

    有没有办法忽略Google游戏服务中的成就?

  27. 27

    火力基地。有没有办法忽略在iOS上调用childAdded?

  28. 28

    有没有办法让git忽略您的HOME设置?

  29. 29

    有没有办法只执行doctest,而忽略打印函数调用?

热门标签

归档