对于实现了Copy特性的类型,如i32,使用起来就容易多了。
(String默认是值传递,不是引用传递,也不是值复制,但是i32类型是值复制)
让我们从简单的东西开始:
我们创建age并调用do_something。这里,age的值被复制了,因为i32类型实现了复制特性。
fn main() { let age: i32 = 25; do_something(age); }
fn do_something(age: i32) { println!("Hello, {}!", age); }
|
在第4行中再次复制了年龄的值。
fn main() { let age: i32 = 25; do_something(age); println!("{}", age); }
fn do_something(age: i32) { println!("Hello, {}!", age); }
|
我们也可以通过引用来传递数值,尽管我认为这不是最佳实践。
fn main() { let age: i32 = 25; do_something(&age); println!("{}", age); }
fn do_something(age: &i32) { println!("Hello, {}!", age); }
|
也可以使用克隆(原型模式)
在第 3 行中,我们首先进行了克隆age,然后将其传递给do_something. 程序会编译,但请注意复制将进行两次:一次在.clone() 中,另一个是当age进入do_something作用域时的复制。
请注意,应避免使用此坏味道用法。请参阅此处的clone_on_copy 上的 Clippy lint 。
fn main() { let age: i32 = 25; do_something(age.clone()); println!("{}", age); }
fn do_something(age: i32) { println!("Hello, {}!", age); }
|