大佬Potato TooLarge, 这个文章,把我搞懵逼了
https://zhuanlan.zhihu.com/p/194156624
fn foobar<'a, 'b, 'k>(set: &'b HashSet<&'a str>, key: &&'k str) -> Option<&'b &'a str>
where 'a: 'b, 'b: 'k
{
set.get(key)
}
问题一:
key: &&'k str
为什么有两个&&
, 不应该只有一个&
问题二:
Option<&'b &'a str>
多个生命周期不应该是,
分割的嘛,这里怎么是空格?
问题三:
我还是看不懂为什么去掉&
,它就能跑起来了,我再理解理解。
1
共 5 条评论, 1 页
评论区
写评论推荐两个Rust生命周期相关的中文资料,希望对理解生命周期有所帮助。
LRFRC系列:Rust生命周期基础 https://mp.weixin.qq.com/s?__biz=MzIxMTM0MjM4Mg==&mid=2247483819&idx=1&sn=777ae853e12ed9259f6e0b6de9e9c34c
LRFRC系列:全面理解Rust生命周期 https://mp.weixin.qq.com/s?__biz=MzIxMTM0MjM4Mg==&mid=2247483826&idx=1&sn=5b3fe0e8b51d5cafb01db1f4a441be66
&'k &'a str
是引用的引用啊,描述的是一个在'a
作用域内的共享引用基础上,产生或者说需要一个 `'k 作用域的共享引用。'a: 'k
关系才能通过编译。'k
,那么你传在'a
作用域有效的引用也行。当然,
&'k &'a str
也是一种类型,而且它与&'a str
是不同的类型。这一点在我给的例子里已经验证过了。Rust Book 讲得很清楚
src: Validating References with Lifetimes
所以,一个
&'a str
并不能说明什么,重要的是 函数签名中生命周期定义/指明的各种引用关系 。key: &'k &'a str
是什么意思啊,是表示key要同时满足k, a着两个生命周期的str类型么?Option<&'b &'a str>
也是这个意思么?我晕的原因是看到的所有资料里都是
key: &'a str
,没见过这样写的--
👇
苦瓜小仔: 这要从生命周期、函数签名一起分析:
回到你的问题:
问题 1 和 3
key: &&'k str
的形式是不正确的,因为编译器没法推断生命周期时,你需要指明所有生命周期而且可以只有一个 &,因为共享借用具有长的生命周期自动转换成短生命周期的性质;
此外,你会发现,你传给函数
&&&&&&&&&&&&&& something
和&something
都可以通过编译,因为 Coercion types 第 1-2 条规则:典型的:共享借用具有长的生命周期自动转换成短生命周期的性质
'a: 'b
条件中,'a 是 'b 的 subtype,表示 'a 生命周期至少比 'b 长 ('a outlives 'b);'static 比所有生命周期长,故 'static 是所有生命周期的子类型,故 'static 可以强制转换成各种小作用域里的生命周期。所以,你写各种形式的借用有时都没问题: playground
见:
问题 2
多个共享借用符号 & 无需分隔 &&,多个生命周期(以及独占借用符号
&mut &mut
、&'a mut
)应该空格分隔的,如果逗号分隔,怎么和函数参数区别开来呢?&'b &'a str 写成 &'b, &'a str 吗?
我也晕了,我贴一下我的理解吧,望路过的大大们斧正。
首先是失败的情况:
然后是成功的情况:
如果只想通过编译的话,下面这种方式也可以。但这种方式在实践中是不合理的,对
key
的生命周期过度约束了。这要从生命周期、函数签名一起分析:
回到你的问题:
问题 1 和 3
key: &&'k str
的形式是不正确的,因为编译器没法推断生命周期时,你需要指明所有生命周期而且可以只有一个 &,因为共享借用具有长的生命周期自动转换成短生命周期的性质;
此外,你会发现,你传给函数
&&&&&&&&&&&&&& something
和&something
都可以通过编译,因为 Coercion types 第 1-2 条规则:典型的:共享借用具有长的生命周期自动转换成短生命周期的性质
'a: 'b
条件中,'a 是 'b 的 subtype,表示 'a 生命周期至少比 'b 长 ('a outlives 'b);'static 比所有生命周期长,故 'static 是所有生命周期的子类型,故 'static 可以强制转换成各种小作用域里的生命周期。所以,你写各种形式的借用有时都没问题: playground
见:
问题 2
多个共享借用符号 & 无需分隔 &&,多个生命周期(以及独占借用符号
&mut &mut
、&'a mut
)应该空格分隔的,如果逗号分隔,怎么和函数参数区别开来呢?&'b &'a str 写成 &'b, &'a str 吗?