Rust中如何检查字符串是否属于固定值集合?
错误原因分析
你写的&*s本质是&String:因为s是拥有所有权的String类型,直接对它解引用*s得到的还是String本身,再取引用自然就是&String。而数组["foo", "bar", "baz"]的元素是&str,它的contains方法要求参数类型为&&str(contains的签名是fn contains(&self, x: &Self::Item) -> bool,这里Self::Item是&str,所以参数需要是&&str),类型不匹配导致报错。
你之前尝试的&&*s也不行,因为*s是String,&&*s是&&String,依然和&&str不匹配。
几种可行的解决方法
方法1:显式转换为&str后取引用
用as_str()方法把String转成&str,再取引用得到&&str,完全匹配参数要求:["foo", "bar", "baz"].contains(&s.as_str())方法2:利用隐式Deref传递&&s
&s是&String,Rust会通过Deref<Target=str>自动将其转换为&str,因此&&s会被推导为&&str,符合contains的参数类型:["foo", "bar", "baz"].contains(&&s)方法3:用iter().any()直接比较内容
这种方式无需纠结引用层级,逻辑更直观:["foo", "bar", "baz"].iter().any(|&item| item == s)这里
iter()遍历数组的&str元素,|&item|将元素解引用为str,String和str实现了PartialEq,可以直接比较内容。
补充说明
你之前误解了*s的作用:只有当s是&String类型时,*s才会通过Deref自动解引用为str;而你的s是拥有所有权的String,直接解引用*s得到的还是String本身。要从String获取&str,可以用&s(隐式转换)或者s.as_str()(显式转换)。
内容的提问来源于stack exchange,提问作者petersohn

