ZhangHanDong / tao-of-rust-codes

《Rust编程之道》随书源码
https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/
MIT License
1.18k stars 170 forks source link

第 13.2.2 节 普通函数调用参数的协变、逆变和不变 第1版 第4次印刷 #295

Open zydxhs opened 4 years ago

zydxhs commented 4 years ago

页码与行数


普通的函数调 用 ,参数是不变。当参数 需要&’ static s衍 类型时,不能用&由代替它。 但是函数的返回值是协变 , 当返回值是&str 的时候,可以返回&’ static str 类型 的值作 为替代 。

issue#30 指出参数是不变。 而我的测试,函数分别为 &str, &'a str, &'static str,实参分别为 &str 和 &'static str,三个函数调用都没问题。

这应该怎么理解?感觉既像是协变,又像逆变? PlayGround 地址: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e341ad718d83fdea7b2263263e930c8d

mzji commented 4 years ago

关于逆变和协变,可以参考 nomiconC# 的相关文档

acodercat commented 4 years ago

这是因为 &str的生命周期始终都是'static, 你换成i32就会报错了

zydxhs commented 4 years ago

3ks @mzji 我找时间看看。 用 i32 类型测试了下,普通的函数调用,更像是协变:

fn bar(s: &i32){
    println!("bar: {}", s);
}

fn bar3(s: &'static i32){
    println!("bar3: {}", s);
}

static INT32: i32 = 23;

fn main() {
    let i: i32 = 12;
    bar(&i);
    bar(&INT32);

    bar3(&INT32);
    //bar3(&i); 这一行报错
}