是否有`Iterator <Item = Str>`的`connect()`实现?

Byr*_*ron 5 rust

目前,SliceConcatExt似乎非常专门为字符串的切片或向量而精心设计,即使它任意限制其使用.这个特定的用例也反映在特征名称中,毕竟,它被调用SliceConcatExt是有原因的.

是否有一个更通用的connect()实现,可以将任何Iterator用于支持Str特性的项目?.如果没有,有没有计划补救这个?

use std::iter::IntoIterator;

fn connected<S, I>(s: I) -> String
where S: Str,
      I: IntoIterator<Item=S> {
    // have
    s.into_iter().collect::<Vec<S>>().connect(", ")

    // want
    // s.into_iter().connect(", ")
    // error: type `<I as core::iter::IntoIterator>::IntoIter` does not implement any method in scope named `connect`
    // tests/lang.rs:790         s.into_iter().connect(", ")
}

connected(&["foo", "bar"]);
Run Code Online (Sandbox Code Playgroud)

有人可能会对SliceConcatExt项目类型为Str的任何迭代器实现,但我怀疑connect()目前只是不必要的专业化,在Rust beta之前可能是可以修复的.

运用 rustc 1.0.0-nightly (522d09dfe 2015-02-19) (built 2015-02-19)

She*_*ter 4

我知道的最接近的解决方案是使用Itertools::intersperse

#![feature(core)]

extern crate itertools;

use std::iter::IntoIterator;
use itertools::Itertools;

fn connected<'a, S, I>(s: I) -> String //'
    where S: Str,
          I: IntoIterator<Item=&'a S> //'
{
    s.into_iter().map(|s| s.as_slice()).intersperse(", ").collect()
}

fn main() {
    println!("{}", connected(&["foo", "bar"]));
}
Run Code Online (Sandbox Code Playgroud)