- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为枚举实现Deref
:
use std::rc::Rc;
use std::ops::Deref;
pub trait tObject {
fn name(&self) -> String;
fn span(&self) -> u32;
}
pub struct t1 {
pub name: String,
pub bd: Option<String>,
pub span: u32,
pub label: Option<String>
}
pub struct t2 {
pub name: String,
pub vrf: Option<String>,
pub span: u32,
pub label: Option<String>,
pub svi: u32
}
pub struct t3 {
pub name: String,
pub span: u32,
pub label: Option<String>
}
impl tObject for t1 {
fn name(&self) -> String {self.name.clone()}
fn span(&self) -> u32 {self.span.clone()}
}
impl tObject for t2 {
fn name(&self) -> String {self.name.clone()}
fn span(&self) -> u32 {self.span.clone()}
}
impl tObject for t3 {
fn name(&self) -> String {self.name.clone()}
fn span(&self) -> u32 {self.span.clone()}
}
pub enum TType {
t1(Rc<t1>),
t2(Rc<t2>),
t3(Rc<t3>)
}
impl Deref for TType {
type Target = tObject;
fn deref<'a>(&'a self) -> &'a tObject {
match *self {
TType::t1(ref x) => x as &t1,
TType::t2(ref x) => x as &t2,
TType::t3(ref x) => x as &t3
}
}
}
fn main() {
let mut t1s: Vec<Rc<t1>> = Vec::new();
let mut t2s: Vec<Rc<t2>> = Vec::new();
let mut t3s: Vec<Rc<t3>> = Vec::new();
let t_iter: Box<Iterator<Item=TType>> = Box::new(t1s.iter().map(|x| TType::t1(x.clone())).chain(
t2s.iter().map(|x| TType::t2(x.clone())).chain(
t3s.iter().map(|x| TType::t3(x.clone())))));
}
编译器报错:
rustc 1.15.1 (021bd294c 2017-02-08)
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter 'a in generic type due to conflicting requirements
--> <anon>:53:5
|
53 | fn deref<'a>(&'a self) -> &'a tObject {
| _____^ starting here...
54 | | match *self {
55 | | TType::t1(ref x) => x as &t1,
56 | | TType::t2(ref x) => x as &t2,
57 | | TType::t3(ref x) => x as &t3
58 | | }
59 | | }
| |_____^ ...ending here
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the body at 53:42...
--> <anon>:53:43
|
53 | fn deref<'a>(&'a self) -> &'a tObject {
| ___________________________________________^ starting here...
54 | | match *self {
55 | | TType::t1(ref x) => x as &t1,
56 | | TType::t2(ref x) => x as &t2,
57 | | TType::t3(ref x) => x as &t3
58 | | }
59 | | }
| |_____^ ...ending here
note: ...so that method type is compatible with trait (expected fn(&TType) -> &tObject + 'static, found fn(&TType) -> &tObject)
--> <anon>:53:5
|
53 | fn deref<'a>(&'a self) -> &'a tObject {
| _____^ starting here...
54 | | match *self {
55 | | TType::t1(ref x) => x as &t1,
56 | | TType::t2(ref x) => x as &t2,
57 | | TType::t3(ref x) => x as &t3
58 | | }
59 | | }
| |_____^ ...ending here
= note: but, the lifetime must be valid for the static lifetime...
note: ...so that method type is compatible with trait (expected fn(&TType) -> &tObject + 'static, found fn(&TType) -> &tObject)
--> <anon>:53:5
|
53 | fn deref<'a>(&'a self) -> &'a tObject {
| _____^ starting here...
54 | | match *self {
55 | | TType::t1(ref x) => x as &t1,
56 | | TType::t2(ref x) => x as &t2,
57 | | TType::t3(ref x) => x as &t3
58 | | }
59 | | }
| |_____^ ...ending here
如果我将返回类型设为 deref
Self::Target
而不是 tObject
,它可以正常编译。我不明白这种行为。
最佳答案
这是一个MCVE .程序员使用这些来帮助缩小问题的范围。例如,此 MCVE 排除了由于使用 enum
、Rc
、特征中的任何方法或结构中的任何字段而导致的任何情况.这使我们能够专注于重要的事情:
use std::ops::Deref;
pub trait Trait {}
pub struct S {}
impl Trait for S {}
pub struct Container(S);
impl Deref for Container {
type Target = Trait;
// fn deref(&self) -> &Trait { // Fails!
fn deref(&self) -> &Self::Target { // Works!
&self.0
}
}
从代码中,我们可以凭直觉知道,不知何故,Trait
和 Self::Target
不是 相同的类型。在这里查看类型有点棘手,但是这段代码将类型打印为编译器错误:
fn deref(&self) -> &Self::Target {
let a: Self::Target;
&self.0
}
error[E0277]: the trait bound `Trait + 'static: std::marker::Sized` is not satisfied
我们实际上并不关心错误,但我们发现了类型:Trait + 'static
。让我们看看如果我们尝试类似的事情会发生什么:
fn deref(&self) -> &(Trait + 'static) {
&self.0
}
这编译。
如果您不熟悉此语法,有很多关于它的问题。这里有一些:
关于rust - 实现 Deref 特征时无法为生命周期参数推断出合适的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42309597/
基础问题 我要解决的基本问题是: 我有一个模板参数包 ArgTypes,我需要用包装在 std::optional 中的每个类型创建一个元组。例如:make_optional_tuple应该返回 st
我使用 createEntityAdapter 设置了一个简单的 redux store。初始状态包含实体、ID、状态、错误设置等 const carouselEventAdapter = creat
我有一些(遗留)代码,如下所示: void castFoo(string type, void* foo) { FooA* foo_a = NULL; FooB* foo_b = NULL;
我的代码是 const int *const ptrA = nullptr; auto *ptrB = &ptrA; 我对 const int *const ptrA 的看法是: (*
我目前正在尝试用 C++ 实现 XOR 链表。我尝试使用模板使其通用。编译时会弹出此错误,我无法解决这个问题。 我尝试使用模板在谷歌上搜索 XOR 链表,但到目前为止似乎还没有实现它。 异或链表.h:
我正在尝试找到一种方法来调用多个类成员函数,每个函数都有不同的参数,并且在调用前后会发生某些已知功能。 这个包装函数是我试过的,但是例如对它的最终调用不会编译错误: 'bool Wrapper(Wor
此代码在 上编译成功g++ ( Coliru ) ,但不是 Visual C++ ( rextester ) - 在线和我的桌面。 它是一个更大的 Visual Studio 2015 项目的简化版本
我正在尝试编写一个通用类,它传递一个键 key 对应于一组已知接口(interface)中的一个的键,稍后可以传递一个对象 thing 并类型安全地访问 thing[key]。这是我得到的: inte
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!