Rust中的字符串引用比较

8

我刚刚确认了 Vec::contains 的工作原理。我写了下面的代码,看起来运行良好。

但是我不知道它为什么能工作,因为它比较的是 &String 类型。这是否意味着即使它们没有被解引用,字符串比较仍然有效?

struct NewStruct {
    string_vec: Vec<Option<String>>,
}

fn main() {
    let mut mys = NewStruct {
        string_vec: Vec::<Option<String>>::new(),
    };
    mys.string_vec.push(Some("new array".to_string()));
    let ref_st = mys.string_vec.iter().filter(|o|o.is_some()).map(|o|o.as_ref().unwrap()).collect::<Vec<&String>>();
    println!("result:{:?}", ref_st.contains(&&("some string".to_string())));
    println!("result:{:?}", ref_st.contains(&&("new array".to_string())));
    println!("Hello, world!");
    f64::from(1234_u64 as i32);
}

这个回答解决了你的问题吗?Rust 的自动解引用规则是什么? - Jmb
1
@Jmb,这不是因为自动解引用,而是因为引用的相等性比较值。 - mcarton
1个回答

21

Rust中引用的引用比较总是比较值,而不是地址。这不仅适用于&String,还适用于任何&T

例如,即使我只比较引用,以下代码也无法编译,因为Foo没有实现PartialEq

struct Foo;

fn main() {
    let a = Foo;
    let b = Foo;

    assert!(&a == &b);
}

error[E0369]: binary operation `==` cannot be applied to type `&Foo`
 --> src/main.rs:7:16
  |
7 |     assert!(&a == &b);
  |             -- ^^ -- &Foo
  |             |
  |             &Foo
  |
  = note: an implementation of `std::cmp::PartialEq` might be missing for `&Foo`

PartialEq在引用上的实现为:

impl<'_, '_, A, B> PartialEq<&'_ B> for &'_ A where
    A: PartialEq<B> + ?Sized,
    B: ?Sized,

您可以看到,检查&A == &B需要能够执行A == B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接