是否有 Rust 签名表明任何强制转换为 T 的类型都将被允许? [重复]

问题描述 投票:0回答:1

所以我刚刚开始学习 Rust 和隐式 Deref 强制。我现在经常遇到的一个“问题”是,这种自动解引用在其他类型中不起作用,例如作为集合的项目类型。在下面的示例(沙箱)中,可以在函数签名中进行哪些更改,以使

main
中的最后一行起作用,或者除了在函数调用之外显式进行转换之外没有其他方法吗?

fn find_in_vec(v: Vec<&str>) -> bool
{
    for e in v {
        if e == "hello" {
            return true;
        }
    }
    false
}

fn is_hello(s: &str) -> bool {
    s == "hello"
}

fn main() {
    let h1: &str = "hello";
    let h2: &Box<String> = &Box::new("hi".to_string());
    println!("{}", is_hello(h1));
    println!("{}", is_hello(h2));

    let a: Vec<&str> = vec!["hello", "world", "!"];
    let b: Vec<&str> = vec!["hallo", "world", "!"];
    let c: Vec<&Box<String>> = vec![&Box::new("hello".to_string())];
    println!("{}", find_in_vec(a));
    println!("{}", find_in_vec(b));
    println!("{}", find_in_vec(c));
}

编译错误:

error[E0308]: mismatched types
  --> src/main.rs:26:32
   |
26 |     println!("{}", find_in_vec(c));
   |                    ----------- ^ expected `Vec<&str>`, found `Vec<&Box<String>>`
   |                    |
   |                    arguments to this function are incorrect
   |
   = note: expected struct `Vec<&str>`
              found struct `Vec<&Box<String>>`

任何有关解决/解决/避免此问题的惯用方法的见解将不胜感激!

rust nested dereference coercion
1个回答
0
投票

如果您需要的是

&str
那么最常见的方法是接受
impl AsRef<str>
,但您必须明确使用该特征:

fn find_in_vec(v: Vec<impl AsRef<str>>) -> bool {
    for e in v {
        let e = e.as_ref();
        if e == "hello" {
            return true;
        }
    }
    false
}

如果您需要拥有一些东西,那么

Into
可能更适合。 一般来说,在您想要将任何可以转换为您想要的类型的情况下,来自
std::convert
的特征是您的朋友。

但正如 PitaJ 所指出的那样,

Box<String>
有点无意义,所以这不起作用。不过,它确实适用于
&str
String
Box<str>
和其他常见字符串类型。

© www.soinside.com 2019 - 2024. All rights reserved.