为什么 Rust 需要所有权注解而不是推断它?
Why does Rust require ownership annotations instead of inferring it?
为什么 Rust 不能完全推断其变量的所有权?为什么需要注释?
如果这可能的话,我相信这将是一个糟糕的用户体验,因为:
- 如果编译器无法推断出对象的所有权,则几乎无法理解错误(就像 C++ 模板中的试错法 link);
- 所有权政策似乎不容易掌握(尽管这是一种观点)并且试图了解编译器选择了哪种语义可能会导致意外行为(参考 Javascript 奇怪的类型转化次数);
- 在重构过程中可以引入更多的错误(由上面的点暗示);
- 完整的程序推理肯定会花费大量时间,即使它是一个可解决的问题。
但是,如果您因缺乏多态性而苦苦挣扎,通常可以使用所有权类型对方法进行参数化,这可能被认为是推理的一种明确替代方法,例如:
fn print_str(s: impl AsRef<str>) {
println!("{}", s.as_ref());
}
fn main() {
print_str("borrowed");
print_str("owned".to_owned());
}
为什么 Rust 不能完全推断其变量的所有权?为什么需要注释?
如果这可能的话,我相信这将是一个糟糕的用户体验,因为:
- 如果编译器无法推断出对象的所有权,则几乎无法理解错误(就像 C++ 模板中的试错法 link);
- 所有权政策似乎不容易掌握(尽管这是一种观点)并且试图了解编译器选择了哪种语义可能会导致意外行为(参考 Javascript 奇怪的类型转化次数);
- 在重构过程中可以引入更多的错误(由上面的点暗示);
- 完整的程序推理肯定会花费大量时间,即使它是一个可解决的问题。
但是,如果您因缺乏多态性而苦苦挣扎,通常可以使用所有权类型对方法进行参数化,这可能被认为是推理的一种明确替代方法,例如:
fn print_str(s: impl AsRef<str>) {
println!("{}", s.as_ref());
}
fn main() {
print_str("borrowed");
print_str("owned".to_owned());
}