所以我刚刚开始学习 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>>`
任何有关解决/解决/避免此问题的惯用方法的见解将不胜感激!
如果您需要的是
&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>
和其他常见字符串类型。