Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
该死的如果你做了,该死的如果你不';t:Rust编译器会抱怨,不管是否存在';这是否是一个生存期参数_Rust_Lifetime - Fatal编程技术网

该死的如果你做了,该死的如果你不';t:Rust编译器会抱怨,不管是否存在';这是否是一个生存期参数

该死的如果你做了,该死的如果你不';t:Rust编译器会抱怨,不管是否存在';这是否是一个生存期参数,rust,lifetime,Rust,Lifetime,我正试图决定是否应该在impls中添加一个life参数,但似乎我处于“如果你这样做,那就去他妈的,如果你不这样做,那就去他妈的”的境地,因为编译器会抱怨,不管是否有life参数 pub结构TurtleRef{ 酒吧fn借来的乌龟(和自己)->借来的乌龟{ *self.t } 新酒吧(右:海龟)->TurtleRef{ TurtleRef{t:&借用Turtle{t:r} } } pub struct借用了Turtle, } 恳求{ 类型Target=Turtle std::ops::DerefM

我正试图决定是否应该在impls中添加一个life参数,但似乎我处于“如果你这样做,那就去他妈的,如果你不这样做,那就去他妈的”的境地,因为编译器会抱怨,不管是否有life参数

pub结构TurtleRef{
酒吧fn借来的乌龟(和自己)->借来的乌龟{
*self.t
}
新酒吧(右:海龟)->TurtleRef{
TurtleRef{t:&借用Turtle{t:r}
}
}
pub struct借用了Turtle,
}
恳求{
类型Target=Turtle std::ops::DerefMut for followeedtutle;
fn deref_mut(&mut self)->&mut self::Target{
&self.t
}
}
pub-struct-Turtle>,
}
海龟有更多的领域,但我删除了它们的简单性。您可以看到代码片段。代码抛出错误

error[E0207]:生存期参数“a”不受impl-trait、self-type或谓词的约束
-->src/校园rs:54:6
|
54 | impl{
|^^无约束生存期参数
没问题,我会删除参数,因为它会引起很大的麻烦。但删除后,我会收到一大堆新错误:


错误[E0261]:使用未声明的生存期名称“%a”`
-->src/校园rs:55:26
|
55 |类型目标=海龟{
|     ^^^^
帮助:考虑在这里引入寿命“A”
|
55 |型靶;
|                ^^^^
不管你说什么,我都会继续将该参数添加到目标中。但现在我得到另一个错误:

error[E0658]:泛型关联类型不稳定
-->src/校园rs:55:5
|
55 |型靶;
|     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
=注:有关更多信息,请参阅第44265期
因此,无论我做什么,似乎都会遇到一个重大错误。如何停止这些错误而不从头开始?我希望保留impls、structs和deref函数,因此我唯一应该更改的是它们的实现

另一方面,我得到了错误

error[E0437]:类型'Target'不是trait'std::ops::DerefMut的成员`
-->src/campus.rs:64:5
|

64 | type Target=Turtle由于
DerefMut
继承自
Deref
,因此不必指定
Target
pub trait DerefMut:DerefMut{/code>使用
Deref
实现中的
Target
定义

Deref特性非常特殊,它不能真正被“普通”用户使用,几乎只有std可以为新类型实现它

这是因为它是借用自身并返回“其他东西”的引用问题是其他东西不能是临时的,std使用it控制rust生态系统以便能够做到这一点,例如
Vec
实现:

impl-ops::为Vec解除故障{
fn deref_mut(&mut self)->&mut[T]{
不安全的{slice::from_raw_parts_mut(self.as_mut_ptr(),self.len)}
}
}
正如您所看到的,slice是一个“胖指针”,因此它只需要一个引用就可以生效,您几乎只能实现
Deref
来返回
Target
等类型的
slice

另一个例子是
PathBuf

impl ops::针对PathBuf的Deref{
类型目标=路径;
#[内联]
fn deref(&self)->路径(&P){
路径::新建(&self.inner)
}
}
这里更清楚的是
Path::new
创建一个胖指针。因此,目标不能是其他不能自包含或已经存在于
self
中的东西

正如秘书长所说:

因此,Deref应该只为智能指针实现,以避免混淆

我认为您真正想要的是实现。所有这些都说明了…这里有一个工作代码:

impl{
目标类型=海龟{
fn deref_mut(&mut self)->&mut self::Target{
&mut self.t
}
}

随你的便。

这里有几个问题。首先:

error[E0207]:生存期参数“a”不受impl-trait、self-type或谓词的约束
-->src/校园rs:54:6
|
54 | impl{
|^^无约束生存期参数
您可以使用匿名生存期,也可以不使用。在这里,您声明了
'a
,因此请使用它:

impl{
要使用省略生存期,您不必声明它:

impl std::ops::Deref用于借用的Turtle;
|不是trait`std::ops::DerefMut的成员`
DerefMut
没有
Target
成员,因为它重用了其supertrait中的
Deref
。这是为了确保项目必须
Deref
DerefMut
到相同的
目标

impl{
目标类型=海龟{
fn deref_mut(&mut self)->&mut self::Target{
&mut self.t
}
}
最后,您现在将得到未使用
'a
的错误:

错误[E0392]:从未使用参数“%a”
-->src/lib.rs:15:27
|
15 | pub struct借来的Turtle{
儿童:Vec{

t:Turtle@Stargateur我发布的2个结构和3个impl相互依赖。为了最小化代码,我遗漏了很多关于Turtle的函数。DerefMut和Deref依赖于借用的Turtle,TurtleRef和impl TurtleRef依赖于借用的Turtle。@Stargateur但我明白你关于再现性的意思,所以我添加了一部分Turtlele struct。你应该能够看到我现在关心的所有3个错误:谁知道编写没有生命周期的代码,然后重复重新编译并遵循错误后列出的生命周期建议会造成这样的麻烦呢?真不敢相信我错过了DerefMut是一种特殊类型的Deref(就像Java子类一样),但匿名生存期是由于我粗心,并按照编译器的建议添加了它们。