Memory 我如何借用一个可变的字符串来把它自己推到它自己身上?

Memory 我如何借用一个可变的字符串来把它自己推到它自己身上?,memory,rust,Memory,Rust,我正在尝试解决一个问题,并且遇到了借用字符串作为可变字符串的问题 我想看看是否有字符串被“循环”了。将“hello”与“llohe”进行比较会返回true,而将“hello”与“oelhl”进行比较则不会返回true。我的策略是将一个字符串加倍,看看它是否包含另一个字符串: fn main(){ 设x=String::from(“hello”); 让mut y=String::from(“llohe”); println!(“{}”,比较(x,&mut y)); } fn比较(x:String,

我正在尝试解决一个问题,并且遇到了借用
字符串作为可变字符串的问题

我想看看是否有
字符串
被“循环”了。将“hello”与“llohe”进行比较会返回true,而将“hello”与“oelhl”进行比较则不会返回true。我的策略是将一个字符串加倍,看看它是否包含另一个字符串:

fn main(){
设x=String::from(“hello”);
让mut y=String::from(“llohe”);
println!(“{}”,比较(x,&mut y));
}
fn比较(x:String,y:&mut String)->bool{
y、 推压(y.为推压());
如果y.包含(&x){
真的
}否则{
假的
}
}
error[E0502]:不能将“*y”作为可变项借用,因为它也是作为不可变项借用的
-->src/main.rs:8:5
|
8 | y.push_str(y.as_str());
|     ^^--------^-^^^^^^^^^^
|     | |        |
|| |此处发生不可变借用
||不可变借阅稍后由调用使用
|可变借用发生在这里

我不知道我到底在哪里这么做。我正试图与编译器成为朋友,但这很棘手。

根本没有理由使用
mut
ref,您可以跳过所有这些:

fn main(){
设x=String::from(“hello”);
让y=String::from(“llohe”);
println!(“{}”,比较(&x,&y));
}
fn比较(x:&String,y:&String)->bool{
设mut z=y.clone();
z、 推压(y.为推压());
//不需要将布尔值封装在if中并返回布尔值,
//让测试结果作为返回值
z、 包含(x)
}
as_str()
函数需要对字符串的引用,但因为您持有的可变引用违反了借用检查器规则。Rust就是不喜欢所有这些参考文献共存

这可能是因为您要求向字符串追加正在追加的字符串的副本,这可能会导致问题
由于_str
需要字符串稳定,
push _str
需要能够更改字符串。他们不能那样互相合作

您可以通过克隆字符串来绕过此步骤:

fn main(){
设x=String::from(“hello”);
让mut y=String::from(“llohe”);
println!(“{}”,比较(x,&mut y));
}
fn比较(x:String,y:&mut String)->bool{
y、 推送字符串(y.clone().作为字符串());
如果y.包含(&x){
真的
}否则{
假的
}
}

借用
字符串是不可能的,因为它是可变的,无法将自身推到自身。相反,您必须首先克隆字符串,然后将克隆版本推送到自身:

y.push_str(y.clone().as_str());
但是,在您的情况下,不需要将可变引用传递给
y
,因为您没有修改它。相反,您可以使用以下命令创建新字符串:

fn main(){
设x=String::from(“hello”);
让y=String::from(“llohe”);
println!(“{}”,比较(x,y));
}
fn比较(x:String,y:String)->bool{
y、 重复(2)。包含(&x)
}

作为问题的答案而不是问题的答案,您根本不需要堆分配;迭代器在这里提供了足够的功能:

fn main(){
让x=“你好”;
让y=“llehe”;
println!(“{}”,比较(x,y));
}
fn比较(x:&str,y:&str)->bool{
设x=x.为_字节();
设mut y=y.as_bytes().iter().chain(y.as_bytes());
环路{
设yy=y.clone();
如果x.iter().eq(yy.take(x.len())){
return true;//或break true;
}
如果y.next()是_none(){
return false;//或break false;
}
}
}