< 返回版块

ltoddy 发表于 2018-07-23 14:23

fn parse_config(args: &[String]) -> (&String, &String) {
    let query = &args[1];
    let filename = &args[2];

    (query, filename)
}

这段来代码来源于Rust程序设计语言。

我有一个疑惑,也就是函数返回值那里: &String,返回的是一个引用。

我可不可以这样理解,在函数内部的query和filename在被return之后,query和filename这两个变量的所有权消失(然后这两个变量被销毁),而query和filename所绑定的值没有消失,然后把值的引用return出去。

还有另一个问题:

struct Config {
    query: String,
    filename: String,
}

fn parse_config(args: &[String]) -> Config {
    let query = args[1].clone();
    let filename = args[2].clone();

    Config { query, filename }
}

这里parse_config的返回死: Config,而且大多结构体的new函数也都是 new(...) -> Self 这样的声明形式, 为什么这个样子就不是引用了?

评论区

写评论
rust-beginner 2018-07-31 14:13

写 Rust 一定要有「名字」和「值」分离的概念。

fn parse_config(args: &[String]) -> (&String, &String) {
    let query = &args[1];    // query 绑定到 &args[1] 这个值上
    let filename = &args[2]; // filename 绑定到 &args[2] 这个值上

    (query, filename)        // 这两个值被移动出函数
                             // query 和 filename 不再能访问 "moved value"
}

这里 query (是一个引用)被移动了,但是 *query (是 String)是不动的。

换句话说:引用也是值! (和 C++ 区别很大。)

struct Config {
    query: String,
    filename: String,
}

fn parse_config(args: &[String]) -> Config {
    let query = args[1].clone();     // 克隆出一个新值,query 绑定到这个值上
    let filename = args[2].clone();  // 克隆出一个新值,filename 绑定到这个值上

    Config { query, filename }       // query 和 filename 绑定的值
                                     // 移动到一个新构造的 Config 中,
                                     // Config 再移动出函数
}

一般我们不强调名字和值的分离,是因为默认大家都理解。但是初学的时候一定要搞清楚。

123hc 2018-07-25 20:05
  • rust的&不止有别名的含义,还有借用所有权的含义(出了作用域要还给owner),移动所有权不用还(相当于新的owner)
  • 第一个例子函数内没有发生owner的移动,只是借用所有权
  • 第二个例子cone() 产生owner,并移动owner到Config的成员,最后将Config的owner移给返回值
123hc 2018-07-25 19:52

rust的&不止有别名的含义,还有借用所有权的含义(出了作用域要还给owner) 第一个例子函数内没有发生所有者的移动,只是借用所有权 第二个例子cone() 产生owner,并移动所有权到Config的成员,最后Config的所有权移动给返回值

123hc 2018-07-25 19:34

rust的&不止有别名的含义,还有借用的含义(出了作用域要还给owner)
第一个例子函数内没有发生所有权的移动,只是借用了一下
第二个例子cone() 产生owner,并移动所有权到Config的成员,最后Config的所有权移动给返回值

Linger 2018-07-25 16:28

是因为query和filename声明时就是一个&String吧,第二个是clone的所为不是引用类型。

1 共 5 条评论, 1 页