bonjiri87
@bonjiri87

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Rustの文字列について

解決したいこと

VBAをかじっていたらプログラミングが楽しくなってきたので、競プロ目指してRustを始めました。
文字列の扱い方で疑問に思ったので、お教えいただければと思います。

コード1が本に載っていたものなのですが、s2の変数が邪魔だと思ってコード2のように直接文字列に変換しようとしたらエラーとなりました。
&を外すようhelpが出たのでコード3のように修正したら無事実行できました。
なぜ、参照を外さなければならなかったのですか?

該当するソースコード

fn main() {
    //コード1
    let s = "ご飯がおいしい";
    let s1: Vec<char> = s.chars().collect();
    let s2 = &s1[3..=6];
    let s3: String = s2.into_iter().collect();
    println!("{}", s3);
    
    //コード2
    let s = "ご飯がおいしい";
    let s1: Vec<char> = s.chars().collect();
    let s2: String = &s1[3..=6].into_iter().collect();
    println!("{}", s2);
}

    //コード3
    let s = "ご飯がおいしい";
    let s1: Vec<char> = s.chars().collect();
    let s2: String = s1[3..=6].into_iter().collect();
    println!("{}", s2);
}
0

1Answer

&x.y() の解釈は (&x).y() ではなく &(x.y()) になります。

コード2の &s1[3..=6].into_iter().collect()&(s1[3..=6].into_iter().collect()) と同じ意味で、 collect で作った値の参照を取ることになります。参照を s2: String に代入することはできないのでエラーになります。

1Like

Comments

  1. @bonjiri87

    Questioner

    回答ありがとうございます!
    &は、s1[3..=6]にしかかかってないと思ってました。
    Rustの勉強は始めたばかりですが、めげずに頑張ります。
  2. 頑張ってください!
    Rust のデバッグに使えるテクニックをいくつか紹介します。

    エラーメッセージには E0123 のようなコードが表示されますが、それを https://doc.rust-lang.org/stable/error-index.html で探すとより詳しい説明や解決策が読めます。

    dbg!(変数名や式)
    と書くと「変数名や式 = その値」の形で内容が出力されます。

    型推論で実際にどの型に推論されるかを知りたいときは
    let _: () = 型推論される式;
    と書いてコンパイルエラーを起こし、エラーメッセージを見れば分かります。

Your answer might help someone💌