根据Rustonomicon,&mut T
在T
上是不变的。当&mut (str, str)
不是&mut (T, T)
的子类型时,以下代码如何编译?
fn swap<T: Copy>(pair: &mut (T, T)) {
let temp = pair.0;
pair.0 = pair.1;
pair.1 = temp;
}
fn main() {
let mut pair = ("left", "right");
swap(&mut pair);
println!("{:?}", pair);
}
相关章节在这里
Rustonomicon意味着只有当V
是T
的子类型时,才能在f(V)
上调用f: (T) -> U
。(第4个代码块,示例是用&mut Cat
调用evil_feeder(pet: &mut Animal)
(。如果上面的例子不是一个子类型,该如何编译?
Variance主要是关于类型强制,其次是关于泛型。
另请参阅https://ehsanmkermani.com/2019/03/16/variance-in-rust-an-intuitive-explanation/,https://doc.rust-lang.org/reference/subtyping.html和https://doc.rust-lang.org/reference/type-coercions.html#coercion-类型。
它可以编译,因为您没有使用&mut (str, str)
。你有一个&mut (&'static str, &'static str)
。这是因为字符串文字是对只读内存的引用,实际字符串存储在可执行文件中。
它可以满足函数的要求,因为即使str
没有实现Copy
,但所有不可变的引用都实现了Copy
。