Почему Rust не делает полного вывода о праве собственности на свои переменные? Зачем нужны аннотации?
Почему Rust требует аннотации владения, а не выводит его?
Ответы (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
Хм, ну полный вывод не противоречит необязательным аннотациям. Но он действительно должен работать полноценно без каких-либо аннотаций.
- person Olle Härstedt; 27.06.2020
Более открытый вопрос здесь (но без ответа): cstheory. stackexchange.com/questions/47126/
- person Olle Härstedt; 14.07.2020
self
и&self
— это разные способы написания метода? Или вы имеете в виду прижизненные аннотации? - person trentcl   schedule 27.06.2020