Почему Rust требует аннотации владения, а не выводит его?

Почему Rust не делает полного вывода о праве собственности на свои переменные? Зачем нужны аннотации?


person Olle Härstedt    schedule 27.06.2020    source источник
comment
Что такое аннотации прав собственности? Вы имеете в виду, что self и &self — это разные способы написания метода? Или вы имеете в виду прижизненные аннотации?   -  person trentcl    schedule 27.06.2020
comment
@trentcl Хорошая ссылка, спасибо! Я предполагаю, что обоснование аналогично, что полный вывод в принципе возможен, но, возможно, нежелателен для целей использования.   -  person Olle Härstedt    schedule 27.06.2020


Ответы (1)


Если бы это было вообще возможно, я считаю, что это был бы ужасный пользовательский опыт, потому что:

  • если компилятор не может определить право собственности на объект, ошибку едва ли можно понять (например, метод проб и ошибок в шаблонах C++ ссылка);
  • политику владения, кажется, нелегко понять (хотя это одно мнение), и попытка понять, какая семантика была выбрана компилятором, может привести к неожиданному поведению (ссылка на странные преобразования типов Javascript);
  • может быть внесено больше ошибок при рефакторинге (подразумевается пунктом выше);
  • полный программный вывод определенно занял бы огромное количество времени, если бы это была решаемая проблема.

Однако, если вы боретесь с отсутствием полиморфизма, обычно можно параметризовать метод с типом владения, что можно рассматривать как несколько явную альтернативу выводу, например:

fn print_str(s: impl AsRef<str>) {
    println!("{}", s.as_ref());
}

fn main() {
    print_str("borrowed");
    print_str("owned".to_owned());
}
person Kitsu    schedule 27.06.2020
comment
Хм, ну полный вывод не противоречит необязательным аннотациям. Но он действительно должен работать полноценно без каких-либо аннотаций. - person Olle Härstedt; 27.06.2020
comment
Более открытый вопрос здесь (но без ответа): cstheory. stackexchange.com/questions/47126/ - person Olle Härstedt; 14.07.2020