Где будет располагаться String :: from ("") в рукаве матча? - PullRequest
0 голосов
/ 17 июня 2019

Я все еще очень плохо знаком с ржавчиной, пришедшей из мира C.

Если у меня есть такой код:

    match self {
        Command::AT => String::from("AT"),
        Command::GetManufacturerId => String::from("AT+CGMI"),
        Command::GetModelId => String::from("AT+CGMM"),
        Command::GetFWVersion => String::from("AT+CGMR"),
        Command::GetSerialNum => String::from("AT+CGSN"),
        Command::GetId => String::from("ATI9"),
        Command::SetGreetingText { ref enable, ref text } => {
          if *enable {
            if text.len() > 49 {
              // TODO: Error!
            }
            write!(buffer, "AT+CSGT={},{}", *enable as u8, text).unwrap();
          } else {
            write!(buffer, "AT+CSGT={}", *enable as u8).unwrap();
          }
          buffer
        },
        Command::GetGreetingText => String::from("AT+CSGT?"),
        Command::Store => String::from("AT&W0"),
        Command::ResetDefault => String::from("ATZ0"),
        Command::ResetFactory => String::from("AT+UFACTORY"),
        Command::SetDTR { ref value } => {
          write!(buffer, "AT&D{}", *value as u8).unwrap();
          buffer
        },
        Command::SetDSR { ref value } => {
          write!(buffer, "AT&S{}", *value as u8).unwrap();
          buffer
        },
        Command::SetEcho { ref enable } => {
          write!(buffer, "ATE{}", *enable as u8).unwrap();
          buffer
        },
        Command::GetEcho => String::from("ATE?"),
        Command::SetEscape { ref esc_char } => {
          write!(buffer, "ATS2={}", esc_char).unwrap();
          buffer
        },
        Command::GetEscape => String::from("ATS2?"),
        Command::SetTermination { ref line_term } => {
          write!(buffer, "ATS3={}", line_term).unwrap();
          buffer
        }    
    }

Как это работает в Rust?Будут ли сразу оцениваться все эти совпадающие ветви, или только одно совпадение создаст изменяемую копию в стеке?А также, будут ли все строковые литералы с моим String::from("") выделены в .rodata?

Есть ли лучший способ сделать то, что я пытаюсь сделать здесь?По сути, я хочу вернуть строковый литерал с замененными параметрами (макрос макросов записи!)?

С уважением

1 Ответ

4 голосов
/ 17 июня 2019

Только соответствующая рука будет оценена. Несоответствующие руки не имеют стоимости, кроме размера программы.

В общем случае невозможно даже оценить другие плечи, так как они зависят от данных, прочитанных с использованием деструктурирования шаблона.

Что касается вашего второго вопроса, местоположение в программе, где хранятся литералы, обычно не называется родата, и оно не указано и не гарантировано (обычно оно дедуплицируется, но это просто оптимизация).

...