rust中的函数参数传递与&运算符

让我们先来看一段代码:

fn main() {
    let s1 = gives_ownership();
   

    let s2 = String::from("hello");
   

    let s3 = takes_and_gives_back(s1);
    println!("{}", s1);
    println!("{}", s2);
    println!("{}", s3);    
} 

fn gives_ownership() -> String {
    let some_string = String::from("hello");


    return some_string;
  
}

fn takes_and_gives_back(a_string: String) -> String { 
   

    a_string  
}

此时println!("{}", s1);报错:borrow of moved value: `s1`

因为let s3 = takes_and_gives_back(s1);这句已经转移了s1的所有权,此时的s1已经名存实亡。

再来看下面代码:

fn main() {
    let s1 = gives_ownership();
   

    let s2 = String::from("hello");
   

    let s3 = takes_and_gives_back(s2);
    println!("{}", s1);
    println!("{}", s2);
    println!("{}", s3);    
} 

fn gives_ownership() -> String {
    let some_string = String::from("hello");


    return some_string;
  
}

fn takes_and_gives_back(a_string: String) -> String { 
   

    a_string  
}

println!("{}", s2); 同样报错error[E0382]: borrow of moved value: `s2`

这说明了:let s2 = String::from("hello");与

fn gives_ownership() -> String {

    let some_string = String::from("hello");

    return some_string;}

实质上是等价的。

想要被转移的变量不失效可以使用clone,看如下代码

fn main() {
    let s1 = gives_ownership();
   

    let s2 = String::from("hello");
   

    let s3 = takes_and_gives_back(s2.clone());
    println!("{}", s1);
    println!("{}", s2);
    println!("{}", s3);    
} 

fn gives_ownership() -> String {
    let some_string = String::from("hello");


    return some_string;
  
}

fn takes_and_gives_back(a_string: String) -> String { 
   

    a_string  
}

或者使用&运算符

fn main() {
    let s1 = gives_ownership();
   

    let s2 = String::from("hello");

    
    let s3 = takes_and_gives_back(&s2);

    println!("{}", s1);
    println!("{}", s2);
    println!("{}", s3);    
} 

fn gives_ownership() -> String {
    let some_string = String::from("hello");


    return some_string;
  
}

fn takes_and_gives_back(a_string: &String) -> &String { 
   

    a_string  
}

那变量的转移 是在什么时候发生的呢?

fn main() {
    let s1 = gives_ownership();
   

    let s2 = String::from("hello");
    
    println!("{}", s2);
    let s3 = takes_and_gives_back(s2);

    println!("{}", s1);
    
    println!("{}", s3);    
} 

fn gives_ownership() -> String {
    let some_string = String::from("hello");


    return some_string;
  
}

fn takes_and_gives_back(a_string: String) -> String { 
   

    a_string  
}

通过这段代码,我们发现println函数并不会转移变量所有权,所以变量的所有权是在被调用函数的return的时候被转移了。

猜你喜欢

转载自blog.csdn.net/lixiaodog/article/details/124590784