我假设您已经阅读了有关错误的其他问题,因此我将仅介绍此具体案例.
你想用&arg[..]
而不是&arg
:
fn without_xxx(args: Args) -> Vec{ let mut out = vec![]; let mut xxx = false; for arg in args { match &arg[..] { "-" => xxx = true, _ => out.push(arg) } } out }
我承认错误很奇怪.这就是我的想法:
当你这样做时&arg
,你正在参考a String
.String
实施Deref
,这意味着他们可以参与deref胁迫.
匹配臂是类型&str
.比较这两种类型时,编译器会看到你有一个&String
并且正在尝试将它与a匹配&str
.它会自动取消引用这两个值并应用deref强制.但是,a str
不能是独立类型,因此您会收到错误.
使用&arg[..]
触发Index
特性代替.这会产生一个&str
,因此匹配臂不会进行任何自动解除引用或强制.
另外:
不需要显式类型 output
在函数/闭包的末尾使用隐式返回.
没有必要打电话,to_string
因为arg
已经是String
.
为了好玩,这是一个使用一个版本filter_map
,collect
和只是一个普通的if
:
fn without_xxx(args: Args) -> Vec{ let mut xxx = false; let out = args.filter_map(|a| { if a == "-" { xxx = true; None } else { Some(a) } }).collect(); // I assume you do something with `xxx` here out }
这可能具有性能优势,因为它可能潜在地为向量的大小分配上限.
另一个版本:
fn without_xxx(args: Args) -> Vec{ let mut xxx = false; let out = args.filter(|a| { let matched = a == "-"; xxx = xxx || matched; !matched }).collect(); // I assume you do something with `xxx` here out }