`Iterator<Item=Str>` 是否有 `connect()` 实现?
Is there a `connect()` implementation for `Iterator<Item=Str>`?
目前 SliceConcatExt 似乎是专门为字符串的切片或向量而设计的,尽管它任意限制了它的使用。该特定用例也反映在特征名称中,毕竟,它被称为 SliceConcatExt
是有原因的。
是否有更通用的 connect()
实现,可以对支持 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"]);
可以为项目类型为 Str 的任何迭代器实现 SliceConcatExt
,但我怀疑 connect()
目前只是不必要的专门化,这在 Rust beta 之前可能是可以修复的。
使用rustc 1.0.0-nightly (522d09dfe 2015-02-19) (built 2015-02-19)
我所知道的最接近的解决方案是使用 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"]));
}
目前 SliceConcatExt 似乎是专门为字符串的切片或向量而设计的,尽管它任意限制了它的使用。该特定用例也反映在特征名称中,毕竟,它被称为 SliceConcatExt
是有原因的。
是否有更通用的 connect()
实现,可以对支持 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"]);
可以为项目类型为 Str 的任何迭代器实现 SliceConcatExt
,但我怀疑 connect()
目前只是不必要的专门化,这在 Rust beta 之前可能是可以修复的。
使用rustc 1.0.0-nightly (522d09dfe 2015-02-19) (built 2015-02-19)
我所知道的最接近的解决方案是使用 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"]));
}