2017-11-06 10 views
2

Stringcharを更新しようとしていますが、これを行うことができないようです。文字列の文字を更新するには?

fn main() { 
    let mut s = "poyo".to_string(); 
    // s[1] = 'i'; or s.get_mut(1) = 'i'; can't do either 
    println!("{}", s); // expecting "piyo" 
} 

答えはStringのソートに依存

playground link

答えて

4

...これはなぜ起こるか私は(StringIndexMut<usize>を実装していません)知っているが、私はこれを解決する方法がわかりませんあなたは対処しています。

fn main() { 
    let mut s = "poyo".to_string(); 
    let mut bytes = s.into_bytes(); 
    bytes[1] = 'i' as u8; 

    unsafe { s = String::from_utf8_unchecked(bytes) } 

    println!("{}", s); 
} 

か::

fn main() { 
    let mut s = "poyo".to_string(); 

    unsafe { 
     let bytes = s.as_bytes_mut(); 
     bytes[1] = 'i' as u8; 
    } 

    println!("{}", s); 
} 
あなただけ(すべての文字のサイズが1バイトで、あなただけの直下 Vec<u8>を操作することができることを意味する)ASCII で作業している場合は、次の操作を行うことができ

しかし、マルチバイト文字を使用している場合(StringにはIndexMutまたはIndexが実装されていない)、安全な方法は、Charsイテレータを使用してその上に新しいStringの要素に基づいて:

fn main() { 
    let s = "poyo".to_string(); 
    let iter = s.chars(); 
    let mut new = String::new(); 

    for (i, mut c) in iter.enumerate() { 
     if i == 1 { c = 'i'; } 
     new.push(c); 
    } 

    println!("{}", new); 
} 
関連する問題