Как изменить конкретный символ в строке?

У меня есть строка, и я хочу обновить значение символа в определенном индексе строки. Я знаю, что индекс, который я собираюсь обновить, существует в строке из-за моего типа ввода. Моей первой идеей было получить изменяемую ссылку на срез в нужном мне индексе, например так:

let mut s = "foo".to_owned();
let index = s.get_mut(1..1).unwrap();
*index = "b";
println!("{}", s);

но компилятор не позволит мне:

he size for values of type `str` cannot be known at compilation time

doesn't have a size known at compile-time

help: the trait `std::marker::Sized` is not implemented for `str`

Что мне удалось сделать, так это изменить точный байт, используя небезопасный as_bytes_mut:

let mut s = "foo".to_owned();
unsafe {
  let bytes = s.as_bytes_mut();
  let index = &mut bytes[2..3];
  'b'.encode_utf8(index);
}
println!("{}", s); // fob

Могу ли я сделать это, не используя небезопасный код?


person danitrod    schedule 18.02.2021    source источник
comment
См. раздел Изменение символов в строке по индексу.   -  person Rabbid76    schedule 19.02.2021
comment
Круто, не знаю, почему я не смог найти его поиском - решает мой вопрос. Спасибо!   -  person danitrod    schedule 19.02.2021
comment
Если я что-то не упустил, это можно сделать с помощью replace_range. Посмотрите, как это работает на игровой площадке   -  person kmdreko    schedule 19.02.2021