基元应照常按值传递,并且应复制通过引用传递的任何内容(“借用”)。就像是:
let a = 7;
let b = duplicate(a); // let b = a;
let a = struct{}{};
let b = duplicate(a); // let b = a.clone();
Run Code Online (Sandbox Code Playgroud)
假设Rust中的每个值都实现Clone或Copy特质。这个假设是真的吗?如果没有,是不是可以定义一个特点Duplicate是类型的enum { Clone, Copy }?
假设Rust中的每个值都实现
Clone或Copy特质。这个假设是真的吗?
没有。
是否可以定义特征
Duplicate
是的,但是除了现有Clone特征之外,它似乎没有其他价值。
您可能希望了解有关所有权的更多信息,因为您无需进行任何克隆就可以编译代码:
fn duplicate<T>(x: T) -> T { x } // sic
fn main() {
let a = 7;
let b = duplicate(a);
let a = String::from("example");
let b = duplicate(a);
}
Run Code Online (Sandbox Code Playgroud)
如果您确实想复制,则只需使用Clone,因为实现的任何东西都Copy必须实现Clone:
pub trait Copy: Clone { }
Run Code Online (Sandbox Code Playgroud)
您通常会将其视为方法语法:
fn main() {
let a = 7;
let b: i32 = a.clone();
let a = String::from("example");
let b: String = a.clone();
}
Run Code Online (Sandbox Code Playgroud)
如果需要函数,请使用标准语法:
fn main() {
let a = 7;
let b: i32 = Clone::clone(&a);
let a = String::from("example");
let b: String = Clone::clone(&a);
}
Run Code Online (Sandbox Code Playgroud)
要么
fn main() {
let a = 7;
let b: i32 = i32::clone(&a);
let a = String::from("example");
let b: String = String::clone(&a);
}
Run Code Online (Sandbox Code Playgroud)
这里所有显式类型(: foo)都是多余的,仅用于演示目的。
| 归档时间: |
|
| 查看次数: |
764 次 |
| 最近记录: |