【问题标题】:How to constrain the element type of an iterator?如何约束迭代器的元素类型?
【发布时间】:2015-01-13 08:28:37
【问题描述】:

我正在转换一些较旧的 Rust 代码以在 1.0.0 上运行。我需要转换一个对字符进行迭代的函数,它曾经这样写:

 fn f<I: Iterator<char>>(char_iter: I)

既然Iterator 不带参数,那么I 上的约束只能是I: Iterator。然后元素类型为I::Item。有没有办法表达I::Item = char 的约束? (或者我应该完全以另一种方式这样做吗?)

【问题讨论】:

    标签: rust


    【解决方案1】:
    fn f<I: Iterator<Item = char>>(char_iter: I)
    

    最近将关联类型添加到该语言中,并且更新了许多库类型以利用它们。例如,Iterator 定义了一种关联类型,名为 Item。您可以通过编写关联类型的名称、等号和您需要的类型来为关联类型添加约束。

    【讨论】:

      【解决方案2】:

      好的,我可以通过阅读一些 RFC 讨论来弄清楚这一点,答案是您可以在 trait 中实例化关联类型(例如 ML 中的签名 fibration):

      fn f<I: Iterator<Item = char>>(char_iter: I)
      

      很快应该可以在where 子句中使用等式约束,但这在 1.0.0-alpha 中不起作用:

      fn f<I: Iterator>(char_iter: I) where I::Item == char
      

      【讨论】:

        【解决方案3】:

        你可以写I: Iterator&lt;Item = char&gt;。在未来的某个时候,像where I::Item == char 这样的where 子句也可能会起作用,但现在不行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-24
          相关资源
          最近更新 更多