- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个基本相同的特征,但一个提供的接口(interface)比另一个低。给定更高级别的特征,可以轻松实现较低级别的特征。我想编写一个接受任一特征实现的库。
我的具体案例是遍历树的特征:
// "Lower level" version of the trait
pub trait RawState {
type Cost: std::cmp::Ord + std::ops::Add<Output = Self::Cost> + std::marker::Copy;
type CulledChildrenIterator: Iterator<Item = (Self, Self::Cost)>;
fn cull(&self) -> Option<Self::Cost>;
fn children_with_cull(&self) -> Self::CulledChildrenIterator;
}
// "Higher level" version of the trait
pub trait State: RawState {
type ChildrenIterator: Iterator<Item = (Self, Self::Cost)>;
fn children(&self) -> Self::ChildrenIterator;
}
// Example of how RawState could be implemented using State
fn state_children_with_cull<S: State> (s: S)
-> impl Iterator<Item = (S, S::Cost)>
{
s.children()
.filter_map(move |(state, transition_cost)|
state.cull().map(move |emission_cost|
(state, transition_cost + emission_cost)
)
)
}
在这里,State trait 提供了一个接口(interface),您可以在其中定义 .children() 函数来列出 child ,以及 .cull()
函数来潜在地剔除一个状态。
RawState
trait 提供了一个接口(interface),您可以在其中定义函数 .children_with_cull()
相反,它遍历子项并在单个函数调用中剔除它们。这允许实现 RawState
甚至永远不会产生它知道会被淘汰的 child 。
我想让大多数用户只实现 State
特征,并具有 RawState
实现将根据其状态实现自动生成。但是,在执行 State
时, 特征的某些部分仍然是 RawState
的一部分,例如
#[derive(Clone, Eq, PartialEq, Hash, Debug)]
struct DummyState {}
impl State for DummyState {
type Cost = u32;
type ChildrenIterator = DummyIt;
fn emission(&self) -> Option<Self::Cost> {
Some(0u32)
}
fn children(&self) -> DummyIt {
return DummyIt {};
}
}
会报错,因为“Cost”类型是在 RawState 中定义的,而不是在 State 中定义的。关于潜在的解决方法,重新定义 State 内部 RawState 的所有相关部分,即将 State 定义为
pub trait State: RawState {
type Cost: std::cmp::Ord + std::ops::Add<Output = Self::Cost> + std::marker::Copy;
type ChildrenIterator: Iterator<Item = (Self, Self::Cost)>;
fn cull(&self) -> Option<Self::Cost>;
fn children(&self) -> Self::ChildrenIterator;
}
但是编译器会提示模棱两可的重复定义。例如在 DummyState
State
的实现, 它会提示 Self::Cost
是模棱两可的,因为它无法判断您是否指的是 <Self as State>::Cost
, 或 <Self as RawState>::Cost
.
最佳答案
考虑到 RawState
和 State
不是 object-safe (因为它们在返回类型中使用 Self
),我假设您不打算为这些特征创建特征对象(即没有 &RawState
)。
超特质界 State: RawState
在处理 trait 对象时最重要,因为 trait 对象只能指定一个 trait(加上从标准库中选择的几个没有方法的白名单 trait,如 Copy
、 Send
和 Sync
)。 trait 对象引用的 vtable 仅包含指向该 trait 中定义的方法的指针。但是如果特征有超特征边界,那么来自这些特征的方法也包含在 vtable 中。因此,一个 &State
(如果它是合法的)会让你访问 children_with_cull
.
超特征绑定(bind)很重要的另一种情况是当子特征为某些方法提供默认实现时。默认实现可以利用绑定(bind)到从另一个特征访问方法的超特征。
由于您不能使用特征对象,并且您没有 State
中方法的默认实现, 我认为你不应该简单地声明超特性绑定(bind) State: RawState
,因为它没有添加任何内容(事实上,会导致问题)。
使用这种方法,有必要从 RawState
复制成员我们需要实现 State
,正如你所建议的。 State
因此将被定义为:
pub trait State: Sized {
type Cost: std::cmp::Ord + std::ops::Add<Output = Self::Cost> + std::marker::Copy;
type ChildrenIterator: Iterator<Item = (Self, Self::Cost)>;
fn cull(&self) -> Option<Self::Cost>;
fn children(&self) -> Self::ChildrenIterator;
}
(请注意,绑定(bind) State: Sized
是必需的,因为我们在 Self
中使用了 ChildrenIterator
。RawState
也需要绑定(bind) RawState: Sized
。)
最后,我们可以提供一条毛毯impl
的 RawState
对于所有实现 State
的类型.有了这个impl
, 任何实现 State
的类型会自动执行RawState
.
impl<T> RawState for T
where
T: State
{
type Cost = <Self as State>::Cost;
type CulledChildrenIterator = std::iter::Empty<(Self, Self::Cost)>; // placeholder
fn cull(&self) -> Option<Self::Cost> { <Self as State>::cull(self) }
fn children_with_cull(&self) -> Self::CulledChildrenIterator {
unimplemented!()
}
}
注意消除名称冲突的语法:<Self as State>
.它用于我们复制的两个成员,因此 RawState
遵从 State
.
关于具有 "simple"和 "advanced"版本的 Rust 特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43714388/
今天,我在 Windows 10 的“程序和功能”列表中看到了 2 个不同版本的 ARC,因此我选择卸载旧版本,因为我需要一些空间。在卸载结束时,它们都消失了! 所以,我从 https://insta
我刚买了一台更强大的电脑,安装了 composer 并想继续我的项目,但是当我使用 gii 时,它给了我这个错误。 我该如何解决?为什么我得到它?谢谢你。 最佳答案 解决了。自 2.0.13 起,类名
1、介绍 这是我的《Advanced .Net Debugging》这个系列的第十一篇文章,也是这个系列的最后一篇了。我已经把原书的前八章内容全部写完了,本来打算继续写第九章和第十章的内容,后
一、介绍 这是我的《Advanced .Net Debugging》这个系列的第十篇文章。这篇文章的内容是原书的第三部分的【高级主题】的第八章【事后调试】。前面几篇文章,我们介绍了很多工具,可以
一、介绍 这是我的《 Advanced .Net Debugging》这个系列的第八篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第六章【同步】。我们经常写一些多线程的应用程序,写的多
一、介绍 这是我的《 Advanced .Net Debugging》这个系列的第九篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第七章【互用性】。互用性包含两个方面,第一个方面就是托
一、简介 这是我的《Advanced .Net Debugging》这个系列的第七篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第五章,这一章主要讲的是从根本上认识托管堆和垃圾回收。软件
一、简介 这是我的《 Advanced .Net Debugging》这个系列的第六篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第四章。这章主要讲的是程序集加载器,比如:CLR 加载
一、简介 我曾看到过许多开发人员使用错误的工具来分析问题,更有甚者,有些人连任何工具都没有使用。他们采取的分析方法通常包括:输出更多的调试信息,或者做一
一、简介 我曾看到过许多开发人员使用错误的工具来分析问题,更有甚者,有些人连任何工具都没有使用。他们采取的分析方法通常包括:输出更多的调试信息,或者做一
一、简介 我曾看到过许多开发人员使用错误的工具来分析问题,更有甚者,有些人连任何工具都没有使用。他们采取的分析方法通常包括:输出更多的调试信息,或者做一
我是 yii2 的新手,当我使用 从存档中提取 yii2 高级内容时《基本应用模板》、《带有高级应用模板的Yii 2》当我在服务器上上传时,它显示空白页面。 我检查了 yii2 basic 它工作正常
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
如果我遗漏了任何重要的细节,我想提前道歉。 我正在尝试执行升级,在安装新版本之前应删除以前版本的软件(和所有组件)。 我会尽量避免让您厌烦细节,并说如果您进行“典型”安装,一切都会按计划进行。如果您选
您好,我正在尝试创建一个存储整数或字符串元素的通用列表迭代器。我正在尝试测试它调用 IteratorG advance(IteratorG it, int n) 函数的情况,该函数采用在列表 it 中
我想知道是否有任何可能的方法,使 MySQL 查询可以动态搜索 WHERE 子句中的任何内容。 例如,如果查询是 Select * from table where item = 'Dell Opti
我正在使用 PayPal Advanced,并使用用户定义的字段 USER1 - USER10 发送一些交易数据,这将帮助我在通过 Silent Post 请求返回时识别它。有谁知道这些 USERx
这个问题在这里已经有了答案: How to use "distanceTo", "advancedBy" to handle String in Xcode7 beta6 (2 个答案) 关闭 7
请告诉我如何提前获得 transactionHash? // I have these tx opts: var txOpts = { "to":"0x345cA3e014Aaf5dcA48805
我正在尝试使用 Eloquent 创建类似的东西。但是,我在使用 or 子句时遇到了麻烦。 SELECT * FROM table WHERE column1 = 1 AND column2 = 2
我是一名优秀的程序员,十分优秀!