语法特性叫 reborrowing, the book 和 the reference 都没写清楚, 实际人人都用,根本离不开的。
// 已有 I 和 X1 以及 `impl From<&mut I> for X1`
struct I(i32);
struct X1;
impl From<&mut I> for X1 {
fn from(p: &mut I) -> X1 {
p.0 = 1;
X1
}
}
// 必须引入这个中间函数
fn x1(p: &mut I) -> X1 {
X1::from(p)
}
// 我想要 `impl From<&mut I> for XT`
struct XT(X1, X1);
impl From<&mut I> for XT {
fn from(p: &mut I) -> XT {
XT(x1(p), x1(p))
}
}
// value used here after move
fn from_twice_fail(p: &mut I) {
let x11 = X1::from(p);
let x12 = X1::from(p);
}
// 跟上面的函数有啥区别,为什么可以?
fn from_twice(p: &mut I) {
let x11 = x1(p);
let x12 = x1(p);
}
1
共 12 条评论, 1 页
评论区
写评论XT(x1(p), x1(p)): p在第一个 x1(p)已经被move了。
结合我自己的搜寻和对下面代码的观察,我有这么几个想法:
--
👇
NoReligion: 这个重借用问题似乎只和
From<_>
有关……--
👇
viruscamp: 稍稍测试了下,应该是泛型函数或trait定义就有
&mut
的,可以自动重借用,而泛型参数被替换成&mut X
的不能自动重借用这个重借用问题似乎只和
From<_>
有关……--
👇
viruscamp: 稍稍测试了下,应该是泛型函数或trait定义就有
&mut
的,可以自动重借用,而泛型参数被替换成&mut X
的不能自动重借用稍稍测试了下,应该是泛型函数或trait定义就有
&mut
的,可以自动重借用,而泛型参数被替换成&mut X
的不能自动重借用我是看 miri 的 stacked borrow 才搞懂 reborrow 的
正如issue里所说,reborrow并没有文档记录,哪些情况下会有reborrow全部在引擎盖之下,幸运的是借助rust-analyzer可以一窥究竟:
通过实验会发现直接调用 trait 方法时,其中的 Self 类型并不会发生reborrow,所以两次调用 X1::from(p) 会失败。
嗯,基本思路是对的,只不过注意:
对于你的代码,显式的重借可以解决
这涉及 reborrow 和泛型的交互,见 https://github.com/rust-lang/rust/issues/85161,而且据此并不被认为是一个错误。
https://alabaster-linen-4dc.notion.site/Rust-86f927bca1794b3b95e3b5ab5f81b9c4
有名字就好查了 better documentation of reborrowing
差不多让我理解的是这段:
我的理解是:
--
👇
苦瓜小仔: reborrow 规则而已。
reborrow 规则而已。