匹配str或String的片段
我有一个函数,可以接受匹配str或String的片段,string,rust,match,String,Rust,Match,我有一个函数,可以接受&[&str]或&[String]并根据片返回不同的值。如果我添加一个PartialEq约束,那么使用==可以很好地工作: pub fn info1, { 如果路径==[“a”,“b”]{ 返回一些(“这是a-b!”。到_string() } 没有一个 } 但如果我使用匹配,则它不起作用: pub fn info2, { 匹配路径{ [“a”,“b”]=>一些(“这是b!”。to_string()), _=>没有, } } 错误[E0308]:类型不匹配 -->src/
&[&str]
或&[String]
并根据片返回不同的值。如果我添加一个PartialEq
约束,那么使用==
可以很好地工作:
pub fn info1,
{
如果路径==[“a”,“b”]{
返回一些(“这是a-b!”。到_string()
}
没有一个
}
但如果我使用匹配
,则它不起作用:
pub fn info2,
{
匹配路径{
[“a”,“b”]=>一些(“这是b!”。to_string()),
_=>没有,
}
}
错误[E0308]:类型不匹配
-->src/lib.rs:16:6
|
11 | pub fn info2您不能为此使用match
你的第一个版本没有错。您可以使用以下工具使其更通用:
pub fn info1(路径:&[S])->选项
哪里
对于
{
如果路径==[“a”,“b”]{
一些(“这是a-b!”。to_string());
}否则{
没有一个
}
}
我得到了一个有用的答案。无法使用match
,因为match
中的模式只能由struct
s、enum
s、slice
s和文本组成。我发现最好的描述是:
模式由以下内容的某些组合组成:
- 文字
- 非结构化数组、枚举、结构或元组
- 变数
- 通配符
- 占位符
在本例中,像“a”
这样的字符串文字是&str
,因此这是唯一一种可以匹配的字符串(您可以看到人们基本上有相同的问题,但没有切片)。在这种情况下,您可以不用分配就可以解决它,因为您不需要构造引用片段,您只需要一个
由于您肯定需要一片&str
s,因此除了分配Vec
之外,没有其他方法:
pub fn info1我们可能是“对立的”,但我至少知道“既然你肯定需要一部分&str,那么除了分配一个Vec之外,真的没有别的办法”是一个糟糕的解决方案。在99%的情况下,定位一个Vec
是一个完美的解决方案。并非每一位代码都必须优化到n度。
error[E0308]: mismatched types
--> src/lib.rs:16:6
|
11 | pub fn info2<'a, S>(path: &[S]) -> Option<String>
| - this type parameter
...
15 | match path {
| ---- this expression has type `&[S]`
16 | ["a", "b"] => Some("It's a b!".to_string()),
| ^^^ expected type parameter `S`, found `&str`
|
= note: expected type parameter `S`
found reference `&'static str`