ref 能做什么而 references 不能?
What can ref do that references couldn't?
什么可以 ref
做引用做不到的?可以
match value.try_thing() {
&Some(ref e) => do_stuff(e),
// ...
}
不等于
match value.try_thing() {
&Some(e) => do_stuff(&e),
// ...
}
Editor's note — this answer was posted when the question was titled "Was Rust's ref keyword avoidable?". The OP has since changed the title, making the phrasing of the answer less sensible.
不,您建议的语法无法避免。在允许移动的情况下,您的语法不允许引用。在此示例中,inner
是 val
中整数的副本,更改它对 val
:
没有影响
fn main() {
let mut val = Some(42);
if let &mut Some(mut inner) = &mut val {
inner += 1;
}
println!("{:?}", val); // Some(42)
}
强制引用需要ref
关键字:
fn main() {
let mut val = Some(42);
if let &mut Some(ref mut inner) = &mut val {
*inner += 1;
}
println!("{:?}", val); // Some(43)
}
Match ergonomics 允许以更简单的方式编写:
fn main() {
let mut val = Some(42);
if let Some(inner) = &mut val {
*inner += 1;
}
println!("{:?}", val);
}
但是,如果我们只从这种语法开始,那么我们可能会遇到相反的问题和关键字,一个是强制移动;另一个是强制移动;也许 Some(move inner)
。在那个替代宇宙中,会有一个问题询问 move
关键字是否可以避免。
另请参阅:
什么可以 ref
做引用做不到的?可以
match value.try_thing() {
&Some(ref e) => do_stuff(e),
// ...
}
不等于
match value.try_thing() {
&Some(e) => do_stuff(&e),
// ...
}
Editor's note — this answer was posted when the question was titled "Was Rust's ref keyword avoidable?". The OP has since changed the title, making the phrasing of the answer less sensible.
不,您建议的语法无法避免。在允许移动的情况下,您的语法不允许引用。在此示例中,inner
是 val
中整数的副本,更改它对 val
:
fn main() {
let mut val = Some(42);
if let &mut Some(mut inner) = &mut val {
inner += 1;
}
println!("{:?}", val); // Some(42)
}
强制引用需要ref
关键字:
fn main() {
let mut val = Some(42);
if let &mut Some(ref mut inner) = &mut val {
*inner += 1;
}
println!("{:?}", val); // Some(43)
}
Match ergonomics 允许以更简单的方式编写:
fn main() {
let mut val = Some(42);
if let Some(inner) = &mut val {
*inner += 1;
}
println!("{:?}", val);
}
但是,如果我们只从这种语法开始,那么我们可能会遇到相反的问题和关键字,一个是强制移动;另一个是强制移动;也许 Some(move inner)
。在那个替代宇宙中,会有一个问题询问 move
关键字是否可以避免。
另请参阅: