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