- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试决定是否应该向我的 impls 添加生命周期参数,但似乎我处于“如果你这样做该死,如果你不这样做该死”的情况,因为无论是否有生命周期,编译器都会提示参数与否。
pub struct TurtleRef<'a> {
t: &'a BorrowedTurtle<'a>,
}
impl TurtleRef<'_> {
pub fn borrowed_turtle(&self) -> BorrowedTurtle {
*self.t
}
pub fn new(r: Turtle) -> TurtleRef {
TurtleRef{t: &BorrowedTurtle{ t:r}}
}
}
pub struct BorrowedTurtle<'a> {
t: Turtle<'a>,
}
impl<'a> std::ops::Deref for BorrowedTurtle<'_> {
type Target = Turtle<'a>;
fn deref(&self) -> &Self::Target {
&self.t
}
}
impl<'a> std::ops::DerefMut for BorrowedTurtle<'_> {
type Target = Turtle<'a>;
fn deref_mut(&mut self) -> &mut Self::Target {
&self.t
}
}
pub struct Turtle<'a> {
children: Vec<Turtle<'a>>,
}
Turtle 有更多字段,但为了简单起见,我删除了它们。可以看到代码片段here .代码抛出错误
error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
--> src/campus.rs:54:6
|
54 | impl<'a> std::ops::Deref for BorrowedTurtle<'_> {
| ^^ unconstrained lifetime parameter
没问题,我将删除该参数,因为它引起了如此大惊小怪。但是在删除它之后,我得到了一大堆新错误:
error[E0261]: use of undeclared lifetime name `'a`
--> src/campus.rs:55:26
|
55 | type Target = Turtle<'a>;
| ^^ undeclared lifetime
|
help: consider introducing lifetime `'a` here
|
54 | impl<'a> std::ops::Deref for BorrowedTurtle<'_> {
| ^^^^
help: consider introducing lifetime `'a` here
|
55 | type Target<'a> = Turtle<'a>;
| ^^^^
无论您说什么,我都会继续并将该参数添加到目标。但是现在我又遇到了另一个错误:
error[E0658]: generic associated types are unstable
--> src/campus.rs:55:5
|
55 | type Target<'a> = Turtle<'a>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
所以无论我做什么,似乎我都遇到了一个重大错误。如何在不从头开始的情况下停止这些错误?我想保留 impls、structs 和 deref 函数,所以我唯一应该改变的是它们的实现。
另一方面,我得到了错误
error[E0437]: type `Target` is not a member of trait `std::ops::DerefMut`
--> src/campus.rs:64:5
|
64 | type Target = Turtle<'a>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ not a member of trait `std::ops::DerefMut`
因为 Turtle 没有实现 DerefMut,事实上 Turtle 不应该实现 DerefMut。是否对 Turtle 进行了轻微修改,从而导致某些东西已经实现了 DerefMut?
最佳答案
这里有几个问题。首先:
error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
--> src/campus.rs:54:6
|
54 | impl<'a> std::ops::Deref for BorrowedTurtle<'_> {
| ^^ unconstrained lifetime parameter
您要么使用匿名生命周期,要么不使用。在这里,您声明了 'a
,所以使用它:
impl<'a> std::ops::Deref for BorrowedTurtle<'a> {
要使用省略的生命周期,您不必声明它:
impl std::ops::Deref for BorrowedTurtle<'_> {
但是这里必须引用Target
中的生命周期,不能省略。
第二个:
error[E0437]: type `Target` is not a member of trait `std::ops::DerefMut`
--> src/lib.rs:28:5
|
28 | type Target = Turtle<'a>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ not a member of trait `std::ops::DerefMut`
DerefMut
没有 Target
成员,因为它重用了其超特性 Deref
中的成员。这是为了确保项目必须 Deref
和 DerefMut
到相同的 Target
:
impl<'a> std::ops::Deref for BorrowedTurtle<'a> {
type Target = Turtle<'a>;
fn deref(&self) -> &Self::Target {
&self.t
}
}
impl std::ops::DerefMut for BorrowedTurtle<'_> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.t
}
}
最后,您现在会收到未使用 'a
的错误:
error[E0392]: parameter `'a` is never used
--> src/lib.rs:15:27
|
15 | pub struct BorrowedTurtle<'a> {
| ^^ unused parameter
|
= help: consider removing `'a`, referring to it in a field, or using a marker such as `PhantomData`
这是因为您有几个递归类型,其中实际上没有使用生命周期:
// 'a isn't actually used for anything
pub struct Turtle<'a> {
children: Vec<Turtle<'a>>,
}
pub struct BorrowedTurtle<'a> {
t: Turtle<'a>,
}
我假设您为了这个答案省略了其他使用 'a
的相关字段,仅此而已!
关于rust - 该死的,如果你这样做,该死的,如果你不 : Rust compiler complains regardless whether there's a lifetime parameter or not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67395001/
class ClassA { class ClassB { } } let compiles: [ClassA.ClassB] let doesNotCompile = [ClassA
同时使用 facebook debugger ,它提示: Warning fb:app_id hasn't been included in the meta tags. Specify the ap
我仍在尝试掌握 Flow 的工作原理,任何人都可以解释为什么这个简单的示例会引发错误? function say(text: string) { console.log(text); } say(
在下面的代码中: public class FooMain { private static void foo(byte b) {} public static void main(S
出于测试目的,我经常开始在现有项目中键入一些代码。因此,我要测试的代码先于所有其他代码,如下所示: public static void main(String[] args) { char
我知道有一百万个关于单例的问题和答案,但我似乎无法找到解决方案。所以冒着反对票的风险,这是我的问题: 我想使用 Andrei Alexandrescu 的现代 C++ 设计中的单例实现: 标题: cl
我是Flutter的初学者。我想创建将数据显示为list,piechart和barchart的TabBarView。当我开始编码时,一切都很好。为了查看它是否正常工作,我在选项卡上附加了不同的颜色。首
这个问题是关于类型转换中的"is"和“作为”以及CA1800 PostSharp规则。我想知道我认为的解决方案是否是最好的解决方案,或者它是否存在我看不到的任何问题。 我有这段代码(名为 Origin
我是 Java 实体的新手,我从 Query.getSingleResult() 调用中遇到了一些奇怪的问题。这是一个代码片段: LoaPoliciesConfig policy = new Lo
SO 上已经有很多关于 unique_ptr 和不完整类型的问题,但没有一个能给我一个概念来理解为什么以下内容不起作用: // error: ... std::pair::second has inc
我有这个代码: struct A{}; template struct B { void foo() {} }; B b; //Error: missing template argument
这个问题在这里已经有了答案: Understanding checked vs unchecked exceptions in Java (21 个答案) 关闭 4 年前。 我有以下代码: publ
我正在使用 OneSignal 来管理我的推送通知。对于某些通知,我收到: Notifications must have English language content 但我只用英语发送所有内容.
我正在尝试执行一个使用 XML::Simple 的简单 Perl 程序从 XML 文件中打印出数据。但是,我得到的错误是: no element found at line 15, column 0,
我正在阅读官方文档:https://react.dev/learn/keeping-components-pure#detecting-impure-calculations-with-strict-
我正在阅读官方文件:https://react.dev/learn/keeping-components-pure#detecting-impure-calculations-with-strict-
我有这个死简单.travis.yml对于一个java项目。当我对文件运行“travis-lint”时提示 [17:24:23@emeraldjava]$ travis-lint /Users/paul
下面是我的二头肌代码,用于创建和分配策略来检测没有诊断设置的 key 保管库。该策略具有 deployIfNotExists 设置。因此它也应该能够创建缺失的诊断设置。 (来自具有修复过程的门户) t
我有以下脚本,它通过 ssh 连接到远程服务器并在其 Postgresql 数据库上发出 SQL 语句: #!/bin/bash db_query() { app_server="$1"
我一直在研究 Swift 协议(protocol),我想弄清楚为什么这段代码不起作用... protocol Animal { var name: String {get} var breed
我是一名优秀的程序员,十分优秀!