質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

3回答

3313閲覧

Rustのベクタを結合したい

toriumi_haru

総合スコア26

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2020/07/01 11:20

タイトルの通りなのですが、

rust

1['h', 'e', 'l', 'l', 'o']

このようなalloc::vec::Vec<char>型のベクタの中身をくっつけて

rust

1hello

にしたいです。

for文で回してjoinしようかと思ったのですができませんでした。
何か方法があれば教えてくださいっ!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Iteratorcollect()メソッドを使うとできます。

rust

1fn main() { 2 let cs = ['h', 'e', 'l', 'l', 'o']; // [char; 5]型 3 let s: String = cs.iter().collect(); 4 assert_eq!(s, "hello".to_string()); 5}

collect()メソッドを使うとイテレータからFromIteratorトレイトを実装した型へ変換できます。ドキュメントにいくつかの使用例が載っていますので参考にしてください。

投稿2020/07/01 12:04

tatsuya6502

総合スコア2035

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toriumi_haru

2020/07/01 12:45

ありがとうございます! この問題に1時間くらい躓いていました。。。
guest

0

rust

1['h', 'e', 'l', 'l', 'o']

が式として書かれているならそれはVec<char>ではなく[char; 5] (array)になると思います。

(edit) Vec<char>とするならvec!['h', 'e', 'l', 'l', 'o']と書きます。

ただarrayの場合も

rust

1let array = ['h', 'e', 'l', 'l', 'o']; 2 3let mut s = "".to_owned(); 4 5// `<&'_ [char; 5] as IntoIterator>`。 今現在のRustでは`array`自体に`IntoIterator`は実装されていない 6for &ch in &array { 7 s.push(ch); 8} 9 10 11assert_eq!(s, "hello"); // `<String as PartialEq<&'_ str>>`

などの書き方で"hello"を構成できます。 &[char] (sliceの参照)で与えられている場合も同様です。

Vec<char>なら直接

rust

1let vec = vec!['h', 'e', 'l', 'l', 'o']; 2 3let mut s = "".to_owned(); 4 5// `<Vec<char> as IntoIterator>` 6for ch in vec { 7 s.push(ch); 8}

とできます。

ただ今回の場合for文を回さなくても"hello"を構成できます。

Iterator<Item = char> (またはIterator<Item = &'_ char>)をIterator::collectStringにすることが可能です。

rust

1let vec = vec!['h', 'e', 'l', 'l', 'o']; 2 3// `<String as FromIterator<&'_ char>>` 4let s = vec.iter().collect::<String>(); 5 6// `<String as FromIterator<char>>` 7let s = vec.into_iter().collect::<String>();

投稿2020/07/01 12:02

編集2020/07/01 12:07
qryxip

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toriumi_haru

2020/07/01 12:44

複数の方法を示していただき、ありがとうございますっ!
guest

0

charではなくてstrを用いてはどうでしょう?引用符を二重引用符にして。

rust

1["h", "e", "l", "l", "o"].join("")

charは特別なUnicode Scalar Valueです、Cみたいにbyteと同じではありません。だから簡単にjoinできません。

追記

間違いましたので訂正します。

charは特別なUnicode Scalar Valueです。だからこそ簡単にjoinできます。Cみたいにbyteでしたら、joinの引数で区切りするとき文字の中に区切りしてしまい文字化けを生んでしまいます。

どうしてまだ実装していませんか?実は5年前もうRustのrepoで実装した例を議論しましたが、主催者いないので止めました。オープンソースコミュニティではこういうこともあります。

投稿2020/07/01 11:55

編集2020/07/02 01:57
YufanLou

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toriumi_haru

2020/07/01 12:43

回答していただきありがとうございます! rustは本当に難しいですね。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問