协方差类型



根据Rustonomicon,&mut TT上是不变的。当&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意味着只有当VT的子类型时,才能在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

最新更新