Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用last_mut()和Option在我的Rust代码中应该更改什么?_String_Rust_Split_Option_Borrow Checker - Fatal编程技术网

String 使用last_mut()和Option在我的Rust代码中应该更改什么?

String 使用last_mut()和Option在我的Rust代码中应该更改什么?,string,rust,split,option,borrow-checker,String,Rust,Split,Option,Borrow Checker,我遇到了一个问题,我的锈代码解决问题,分裂给定的字符串对椅子。起初我使用了last(),但更改最后一个元素时出现了错误。我将last()替换为last\u mut() fn解决方案(s:&str)->Vec{ 让mut result:Vec=Vec![“”.to_string()]; 对于s.chars()中的成员{ 如果结果.last_mut().len()src/lib.rs:10:31 | 10 | result.last_mut().push_str(member.to_string()

我遇到了一个问题,我的锈代码解决问题,分裂给定的字符串对椅子。起初我使用了
last()
,但更改最后一个元素时出现了错误。我将
last()
替换为
last\u mut()

fn解决方案(s:&str)->Vec{
让mut result:Vec=Vec![“”.to_string()];
对于s.chars()中的成员{
如果结果.last_mut().len()<2{
result.last_mut().push_str(member.to_string());
}否则{
结果。将(“.”推到字符串();
result.last_mut().push_str(member.to_string());
}
}
如果结果.last_mut().len()<2{
result.last_mut().push_str(“”);
}
结果
}
此代码必须按示例中的成对返回椅子

solution(“abcdef”)//应返回[“ab”、“cd”、“ef”]
解决方案(“abcdefg”)//应返回[“ab”、“cd”、“ef”、“g_3;”]
但它返回错误

error[E0599]:在当前作用域中找不到枚举`Option`名为`len`的方法
-->src/lib.rs:6:30
|
6 |如果结果为最后一个_mut().len()<2{
|^^^在`选项中找不到方法`
错误[E0599]:在当前作用域中找不到enum`Option`名为`push_str`的方法
-->src/lib.rs:7:31
|
7 | result.last_mut().push_str(member.to_string());
|在`选项中找不到^`
错误[E0599]:在当前作用域中找不到enum`Option`名为`push_str`的方法
-->src/lib.rs:10:31
|
10 | result.last_mut().push_str(member.to_string());
|在`选项中找不到^`
错误[E0599]:在当前作用域中找不到枚举`Option`名为`len`的方法
-->src/lib.rs:13:26
|
13 |如果结果.最后一个_mut().len()<2{
|^^^在`选项中找不到方法`
错误[E0599]:在当前作用域中找不到enum`Option`名为`push_str`的方法
-->src/lib.rs:14:27
|
14 | result.last_mut().push_str(“”);
|在`选项中找不到^`
我应该在我的代码中替换什么以使其使用
选项
?这对我来说是新的构造。谢谢!

最后一个
(和
最后一个
)返回一个
选项
,因为就编译器而言,向量总是空的

在您的情况下,通过构造这是不可能的(因为您创建了一个非空的vec,然后总是附加到它),但编译器不知道,因此您可以:

  • unwrap
    获取其包含的引用的选项
  • 或者使用常规索引,例如
    &mut result[result.len()-1]
或者,一个更简单的构造是从
Vec
构建“最后一项”,然后在完成后将其推入。这样编译器就可以知道它在每一点上都是有效的

let mut result = vec![];
let mut current = String::new();
for member in s.chars() {
    if current.len() < 2 {
        current.push(member);
    } else {
        result.push(current);
        current = member.to_string();
    }
}
if current.len() > 0 {
    if current.len() == 1 {
        current.push('_');
    }
    result.push(current)
}
让mut result=vec![];
让mut current=String::new();
对于s.chars()中的成员{
如果当前.len()<2{
当前推送(成员);
}否则{
结果:推送(电流);
当前=成员。到_字符串();
}
}
如果当前.len()大于0{
如果当前.len()==1{
当前推送(“uu”);
}
结果:推送(当前)
}

另请注意:
String::push
使用
char
,您不需要将
char
s转换为
String
,以便将它们连接起来。另外,请注意,在组合字符和朋友的情况下,您的代码会被破坏。

如果您在
字符串上执行所有的突变,您将有一段轻松得多的时间在将其推入
Vec
之前,这里有一个更简单的清洁解决方案:

fn解决方案(s:&str)->Vec{
让mut result=Vec::new();
让mut pair=String::new();
对于s.chars()中的c{
如果pair.len()==2{
结果:推(对);
pair=String::new();
}
对推(c);
}
如果pair.len()==2{
结果:推(对);
}如果pair.len()==1,则为else{
配对。推(“uuz”);
结果:推送(对)
}
结果
}
fn main(){
assert_eq!(解决方案(“abcdef”)、vec![“ab”、“cd”、“ef”);
assert_eq!(解决方案(“abcdefg”)、vec![“ab”、“cd”、“ef”、“g_”])
}