rust 这里有没有发生一个参考模式?

yb3bgrhw  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(164)
fn main() {
    // i passed a reference to a value of type i32
    print_type_of(&1); // but print: i32

    // but if i pass a double reference
    print_type_of(&&1); // it print &i32, not &&i32

    // i passed a referece to a value of type i32
    print_type_of_without_ampersand(&1); // now print: &i32 as expected

    referece_pattern(&1); // it works!

    // -> update <-

    // if i have
    let x = 1;
    let ref_x = &&x;

    // this is the implementation of Deref for &T
    // #[stable(feature = "rust1", since = "1.0.0")]
    // #[rustc_const_unstable(feature = "const_deref", issue = "88955")]
    // impl<T: ?Sized> const Deref for &T { //! -> here T should be &&i32 or &i32 ? <- !
    //     type Target = T;

    //     #[rustc_diagnostic_item = "noop_method_deref"]
    //     fn deref(&self) -> &T { // if here self is &&i32, and T should be &&i32 too
    //         *self // <- here  after deference self should be &i32, but &T is still &&i32 that is incompatible <- !
    //     }
    // }
    // -> end update <-
}

// amperand is before the type name
// so it should not be a reference pattern
fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>())
}

fn print_type_of_without_ampersand<T>(_: T) {
    println!("{}", std::any::type_name::<T>())
}

// reference pattern happens here
// amperand is before the parameter name
fn referece_pattern(&x: &i32) {
    assert!(x == 1);
    println!("it works!");
}

我也读过这篇关于引用模式的文章,但是它没有解释这一点。
更新:我在代码中添加了新内容,关于&T的Deref实现

a8jjtwal

a8jjtwal1#

我不太清楚你到底哪里搞错了。

fn print_type_of<T>(_: &T);

是一个带有类型参数T的函数,它接收到一个对T的引用(&T),所以如果你给予它一个&i32,那么引用所指向的类型就是i32,所以当你以后调用type_name::<T>()时,你会得到i32,因为T就是这样的。
如果T解析为&i32,就像您所期望的那样,那么它将期望类型为&&i32的项。
没有引用模式,只是在进行替换后检查类型的方式。

相关问题