Удалить одиночный завершающий перевод строки из строки без клонирования

Я написал функцию для запроса ввода и возврата результата. В этой версии возвращаемая строка содержит завершающий перевод строки от пользователя. Я хотел бы вернуть ввод с удаленной новой строкой (и только с этой новой строкой):

fn read_with_prompt(prompt: &str) -> io::Result<String> {
    let stdout = io::stdout();
    let mut reader = io::stdin();
    let mut input = String::new();
    print!("{}", prompt);
    stdout.lock().flush().unwrap();
    try!(reader.read_line(&mut input));

    // TODO: Remove trailing newline if present
    Ok(input)
}

Причина удаления только одного завершающего символа новой строки заключается в том, что эта функция также будет использоваться для запроса пароля (при соответствующем использованииtermios прекратить эхо), и если у чьего-либо пароля есть пробел, это должно быть сохранено.

После долгих раздумий о том, как на самом деле удалить одну новую строку в конце строки, я в конечном итоге использовалtrim_right_matches, Однако это возвращает&str, Я пытался с помощьюCow иметь дело с этим, но ошибка по-прежнему говорит о том, чтоinput переменная не живет достаточно долго.

fn read_with_prompt<'a>(prompt: &str) -> io::Result<Cow<'a, str>> {
    let stdout = io::stdout();
    let mut reader = io::stdin();
    let mut input = String::new();
    print!("{}", prompt);
    stdout.lock().flush().unwrap();
    try!(reader.read_line(&mut input));

    let mut trimmed = false;
    Ok(Cow::Borrowed(input.trim_right_matches(|c| {
        if !trimmed && c == '\n' {
            trimmed = true;
            true
        }
        else {
            false
        }
    })))
}

Ошибка:

src/main.rs:613:22: 613:27 error: `input` does not live long enough
src/main.rs:613     Ok(Cow::Borrowed(input.trim_right_matches(|c| {
                                     ^~~~~
src/main.rs:604:79: 622:2 note: reference must be valid for the lifetime 'a as
 defined on the block at 604:78...
src/main.rs:604 fn read_with_prompt<'a, S: AsRef<str>>(prompt: S) -> io::Resul
t<Cow<'a, str>> {
src/main.rs:605     let stdout = io::stdout();
src/main.rs:606     let mut reader = io::stdin();
src/main.rs:607     let mut input = String::new();
src/main.rs:608     print!("{}", prompt.as_ref());
src/main.rs:609     stdout.lock().flush().unwrap();
                ...
src/main.rs:607:35: 622:2 note: ...but borrowed value is only valid for the bl
ock suffix following statement 2 at 607:34
src/main.rs:607     let mut input = String::new();
src/main.rs:608     print!("{}", prompt.as_ref());
src/main.rs:609     stdout.lock().flush().unwrap();
src/main.rs:610     try!(reader.read_line(&mut input));
src/main.rs:611
src/main.rs:612     let mut trimmed = false;
                ...

На основепредыдущие вопросы по этим направлениям кажется, это невозможно. Является ли единственная возможность выделить новую строку, для которой удален завершающий символ новой строки? Кажется, должен быть способ обрезать строку, не копируя ее (в C вы просто замените'\n' с'\0').

Ответы на вопрос(3)

Ваш ответ на вопрос