You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何检查字符串是否属于固定值集合?

Rust检查String是否在固定&str集合中的问题解决

错误原因分析

你写的&*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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:20:26