2017-03-28 11 views
2

変更可能な文字列を取り、最初と最後の文字が"文字であるかどうかを確認する関数を記述します。その場合は、これらの2文字をバックティック文字`に置き換える必要があります。特定のASCII文字を文字列内の他のASCII文字と置き換える簡潔で安全な方法

fn replace_wrapping_char(s: &mut String) { 
    if s.len() > 1 && s.starts_with('"') && s.ends_with('"') { 
     unsafe { 
      let v = s.as_mut_vec(); 
      v[0] = '`' as u8; 
      *v.last_mut().unwrap() = '`' as u8; 
     } 
    } 
} 

はこれが(真はい、'`'.is_ascii()リターン)を動作するようですが、それはunsafe私には少し醜いを使用しています。私は、このソリューションを作ってみました。

私が欲しいものを達成するための安全で簡潔な方法はありますか?

+0

https://stackoverflow.com/questions/26544542/modifying-chars-in-a-string-by-index –

+0

あなたは、文字列全体がASCIIになりますかどうかを知る、またはでありますか最初/最後の文字がASCIIであることが保証されているだけですか? – Shepmaster

+0

@Shepmaster私は文字列のアスキー文字について何も知らない。最初の/最後の文字が '' 'の場合、それらはascii(明らかに...)です。そうでなければ保証はありません。 –

答えて

1

ここでは安全で短縮されたバージョンの関数ですが、メモリは効率的ではありません。これによりコピーが作成され、指定された文字列が再割り当てされるので、新しい文字列を返す純粋な関数プロトタイプがおそらくもっと適しています。また、二重引用符文字がUTF-8で1バイトのサイズであるという事実にも依存しています。

fn replace_wrapping_char(s: &mut String) { 
    if s.len() > 1 && s.starts_with('"') && s.ends_with('"') { 
     *s = format!("`{}`", &s[1 .. s.len()-1]) 
    } 
} 

Playground

+1

Noobの質問ですが、これは文字列全体をコピーしてから 's'に再割り当てしますか?最初と最後のバイトを変更するだけでいいのですか? – Alec

+0

@Alec Exactlyこれは文字列をコピーして再割り当てするので、これは問題の最良の解決策ではないと私は認めますが、誰かがコピーを持っている場合に備えてここに残しておきます。 –

+0

@Alec *最後のバイト* - これはOPの解決策ですが、タイプシステムは最初の/最後のバイトを保証できないため安全ではありませんe *は* ASCIIで*はASCIIのままです。 – Shepmaster

関連する問題