【问题标题】:(rust) how to replace Box<dyn T+'a> with more generic `AsRef`(rust) 如何用更通用的 `AsRef` 替换 Box<dyn T+\'a>
【发布时间】:2022-12-18 01:28:25
【问题描述】:

我是 Rust 的新手。

我的任务是创建将 Iterator&lt;&amp;str&gt;Iterator&lt;String&gt;Iterator&lt;io::Result&lt;String&gt;&gt; 转换为 Iterator&lt;MyRecord&gt; 的函数,以便逐行流式读取大文本文件并使用简单的 vec!["...","..."] 对其进行测试

经过几个小时的脑雾我解决了它,但它不是很漂亮......

  1. 虽然io::Result&lt;String&gt;没有共同特征AsRef&lt;str&gt;,但我定义了自己的特征StringRef,并针对&amp;strStringio::Result&lt;String&gt;实现了它

  2. 我为自己的迭代器创建结构:

    struct ReaderIterator<'a,S:StringRef> {
        lines: Box<dyn Iterator<Item=S> + 'a>,
    }
    

    并在其上实施Iterator&lt;MyRecord&gt;

    一切正常。任务完成。

    但我仍然对这段代码不满意。

    1. Box - 可能应该更好 AsRef
    2. dyn XXX - 我会更好&lt;'a,S:StringRef, I&gt; where I:Iterator...

      我尝试将其替换为:

      struct ReaderIterator<'a,S:StringRef> {
          lines: AsRef<dyn Iterator<Item=S> + 'a>,
      }
      

      不工作-error[E0782]: trait objects must include the dyn keyword

      再试一次

      struct ReaderIterator<'a,S:StringRef> {
          lines: dyn AsRef<dyn Iterator<Item=S> + 'a>,
      }
      

      不工作 - expected trait object dyn AsRef, found struct Box`,而 Box 的 AsRef 特征在哪里......

      tryes 泛化迭代器:

      struct ReaderIterator<'a,S:StringRef, I> where I:Iterator<Item = S> {
          lines: Box<I + 'a>,
      }
      

      不工作-not a trait

      struct ReaderIterator<'a,S:StringRef, I> where I:Iterator<Item = S> + 'a {
          lines: I,
      }
      

      灾难性的unused parameter a,unused parameter S - 如果我在哪里使用它们,为什么它们没有被使用???

      请谁能解释 - 如何正确概括实体一些(作为参考)对某些 (I) 迭代器的引用,该迭代器迭代某些 (S) StringRef 特征 ???

      代替盒子在某些 (S) 字符串引用上引用某些迭代器

      真的卡住了……

【问题讨论】:

  • 不要使用 S,只需将 I 作为通用名称,并在 impl 中引用 I::Item: StringRef

标签: rust iterator traits


【解决方案1】:

这样的事情应该有效:

struct ReaderIterator<'a,I>
where
    I: Iterator + 'a,
    I::Item: StringRef,
{
    lines: I,
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多