文字列のベクトルに対する結合演算子に相当するものは何ですか?


120

Stringsのベクトルに対する "join"演算子と同等のRustを見つけることができませんでした。私にはがありVec<String>、それらをシングルとして参加したいString

let string_list = vec!["Foo".to_string(),"Bar".to_string()];
let joined = something::join(string_list,"-");
assert_eq!("Foo-Bar", joined);

関連:

回答:


153

Rust 1.3.0以降でjoinは、次のものが利用可能です。

fn main() {
    let string_list = vec!["Foo".to_string(),"Bar".to_string()];
    let joined = string_list.join("-");
    assert_eq!("Foo-Bar", joined);
}

1.3.0より前は、このメソッドが呼び出されていましたconnect

let joined = string_list.connect("-");

メソッドは標準ライブラリpreludeによって自動的にインポートされるため、何もインポートする必要がないことに注意してください。


7
おそらくこれは変更されましたSliceConcatExtが、毎晩のみです。

5
@Evertトレイトは不安定とマークされていますが、そのメソッドは安定しているため、使用できます。use特性はプレリュードにあるので、明示的にする必要はありません。
インタージェイ2017


1
@shepmaster「返信」を正しく読んだ場合は、joinがありitertoolsます。
スティーブパウエル

2
@shepmasterありがとうございます。残念ながら、別の回答への装飾のない参照はかなり不可解なため、その回答のどの部分が関連しているかはまったく明確ではありませんでした。あなたのコメント、訂正、回答は常に優れていますが、あなたのスタイルは軽蔑的で不快なものです。
スティーブパウエル


10

イテレータに参加する、itertoolsクレートからも呼び出される関数joinがあります。

extern crate itertools; // 0.7.8

use itertools::free::join;
use std::fmt;

pub struct MyScores {
    scores: Vec<i16>,
}

impl fmt::Display for MyScores {
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
        fmt.write_str("MyScores(")?;
        fmt.write_str(&join(&self.scores[..], &","))?;
        fmt.write_str(")")?;
        Ok(())
    }
}

fn main() {
    let my_scores = MyScores {
        scores: vec![12, 23, 34, 45],
    };
    println!("{}", my_scores); // outputs MyScores(12,23,34,45)
}

6
このコードのユーザーは、それを捨てるためだけに、潜在的に大きな文字列を割り当てることに注意する必要があります。文字列を直接出力に書き込む方が効率的です。Rustでスペースで区切られたイテレータを印刷する慣用的な方法は何ですか?も参照してくださいRustで、コンテナの各値の間に何かを印刷する最良の方法は何ですか?
シェプマスター2018

2
理解できるのですが、問題はについてjoinでしたが、フォーマットアルゴリズムを最適化する方法ではありませんでしたか?
Nick Linker 2018

6
collect+ joinより高速で依存関係が追加されません。ベンチマークについては、この要旨を参照してください
murlakatamenka
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.