【问题标题】:Is it possible to have a variable local to a trait implementation?特性实现是否可以有一个局部变量?
【发布时间】:2016-04-04 13:00:03
【问题描述】:

我有一个要迭代的可索引类型。它由一些元数据和一个数组组成。我需要先遍历元数据的字节,然后遍历数组的字节。据我了解,迭代器不能在 trait 实现中拥有任何本地存储。我认为这是非常杂乱无章的,我不希望我的数据类型被满足外来影响的需要所混淆。

impl Iterator for IndexableData {
  type Item = u8
  let index : isize = 0;
  fn next(& mut self) -> Option<Item> {
     if self.index > self.len() { None }
     if self.index > size_of::<Metadata> {
       Some (self.data[index - size_of::<Metadata>])
     } 
     Some (self.metadata[index])
  }
}

这就是我认为实现的样子。 index 变量 属于 在迭代器特征中。不是我的IndexableData 类型。我怎样才能做到这一点?

【问题讨论】:

  • 你的问题和这个很相似:stackoverflow.com/questions/30218886/….
  • 啊,我不知道那个问题。我在搜索我想到的东西时没有找到它。
  • 您应该知道找到该问题的解决方案 :)
  • Rust 的生命周期语言记录不充分,类型参数化语言也很不稳定。就我而言,我拥有所有这些 impl

标签: rust


【解决方案1】:

Iterator 应该是一个单独的结构,它具有对集合的引用以及它可能需要的任何其他数据(例如此索引)。集合对象本身应该不是一个迭代器。这不仅需要在集合中错放额外的元数据,还会阻止您在集合上拥有多个独立的迭代器。

【讨论】:

  • 这最终使得与其他特征的许多互操作非常不稳定。我的意思是,感兴趣的数据是程序员开始并想要关注的,但是在符合类型检查器的过程中,他们最终制作了所有这些隐藏在幕后的辅助结构否则,构成公共接口的一组无害的方法。程序员对制作所有其他结构不感兴趣,因为这基本上只是语言强加的噪音。
  • 此外,当需要在后台进行特征之间的互操作时,这种噪音可能会使其他任务复杂化。
  • @AdamMiller 这不是强制执行以破坏您的一天的毫无意义的样板。 在我所知道的每种语言中,迭代器(在此处使用的意义上)与集合是分开的(尽管有些迭代器更容易定义一次性迭代器,例如 Python 中的生成器)。 在逻辑上是必要的,因为正如我所说,您希望能够在集合上拥有多个迭代器,并且在不需要时不携带迭代器的包袱。 [由于缺乏示例,我无法解决您关于“其他特征”的观点。]
  • 我不反对——你只同意我所说的一半。首先,将其他数据类型与公共接口隔离开来,只展示尽可能简约的消费者 api 是正确的。但我要确定的问题是,有这么多类型的争吵正在把它变成一个牛仔竞技表演。老实说,对于很多接口,我不希望再次使用该类型。对我来说,拥有 trait 本地私有字段似乎是有意义的,编译器将使用它来自动派生一个结构。对我来说似乎不那么繁琐,但不可否认,只是有时更直观。
猜你喜欢
  • 2017-08-11
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2011-01-25
相关资源
最近更新 更多