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 这样的声明形式, 为什么这个样子就不是引用了?
1
共 5 条评论, 1 页
评论区
写评论写 Rust 一定要有「名字」和「值」分离的概念。
这里 query (是一个引用)被移动了,但是 *query (是 String)是不动的。
换句话说:引用也是值! (和 C++ 区别很大。)
一般我们不强调名字和值的分离,是因为默认大家都理解。但是初学的时候一定要搞清楚。
rust的&不止有别名的含义,还有借用所有权的含义(出了作用域要还给owner) 第一个例子函数内没有发生所有者的移动,只是借用所有权 第二个例子cone() 产生owner,并移动所有权到Config的成员,最后Config的所有权移动给返回值
rust的&不止有别名的含义,还有借用的含义(出了作用域要还给owner)
第一个例子函数内没有发生所有权的移动,只是借用了一下
第二个例子cone() 产生owner,并移动所有权到Config的成员,最后Config的所有权移动给返回值
是因为query和filename声明时就是一个&String吧,第二个是clone的所为不是引用类型。