- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下实现草图:
trait Listener {
fn some_action(&mut self);
fn commit(self);
}
struct FooListener {}
impl Listener for FooListener {
fn some_action(&mut self) {
println!("{:?}", "Action!!");
}
fn commit(self) {
println!("{:?}", "Commit");
}
}
struct Transaction {
listeners: Vec<Box<dyn Listener>>,
}
impl Transaction {
fn commit(self) {
// How would I consume the listeners and call commit() on each of them?
}
}
fn listener() {
let transaction = Transaction {
listeners: vec![Box::new(FooListener {})],
};
transaction.commit();
}
我可以有 Transaction
上面有监听器,当事务发生某些事情时,监听器会调用监听器。自 Listener
是一个特征,我存储一个 Vec<Box<Listener>>
.
我很难实现 commit
对于 Transaction
.不知何故,我必须通过调用 commit
来消耗这些盒子在每个存储的 Listener
上s,但据我所知,我不能把东西从盒子里拿出来。
我将如何在提交时使用我的听众?
最佳答案
正在申请 commit
到装箱对象是不允许的,因为特征对象不知道它的大小(并且它在编译时不是常量)。由于您计划将监听器用作盒装对象,因此您可以做的是确认 commit
将在框上调用并相应地更改其签名:
trait Listener {
fn some_action(&mut self);
fn commit(self: Box<Self>);
}
struct FooListener {}
impl Listener for FooListener {
fn some_action(&mut self) {
println!("{:?}", "Action!!");
}
fn commit(self: Box<Self>) {
println!("{:?}", "Commit");
}
}
这会启用 Transaction
按照你编写的方式进行编译,因为在 FooListener
的实现中Self
的大小众所周知,完全有可能将对象移出盒子并同时消耗两者。
此解决方案的价格是 Listener::commit
现在需要 Box
.如果这 Not Acceptable ,您可以同时声明 commit(self)
和 commit_boxed(self: Box<Self>)
在特性中,要求所有类型都实现两者,可能使用私有(private)函数或宏来避免代码重复。这不是很优雅,但它可以同时满足装箱和未装箱的用例,而不会损失性能。
关于rust - 如何调用在盒装特征对象上消耗 self 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54018162/
我正在努力寻找任何教程来帮助我将 SurfaceView 放入盒子中。一个指向正确方向的指针会很棒——而不是通过它寻找一只手。 我希望能够在屏幕顶部分配一个区域,例如做按钮等,然后让表面 View 填
我需要一个返回所提供类类型实例的方法。让我们假设提供的类型被限制为可以创建它们的“空”实例。例如,提供 String.class 将返回一个空字符串,提供一个 Integer.class 将返回一个初
小问题:是否保证此代码始终打印 true? Boolean b1 = true; Boolean b2 = true; System.out.println(b1 == b2); boolean 值的
我昨晚在开发一个应用程序时遇到了一个特定的问题,我确信它可能有一个有效的算法来解决它。谁能推荐一下? 问题: TL;DR:也许图片会有所帮助:http://www.custom-foam-insert
我正在使用 ggplot2 开发一个图形,其中我需要将文本叠加在其他图形元素上。根据文本下方元素的颜色,文本可能难以阅读。有没有办法在半透明背景的边界框中绘制geom_text? 我可以用plotri
使用 rustc 1.10.0,我正在尝试编写一些绕过盒装闭包的代码——最终目标是按程序生成分形动画。现在我有一些像这样的函数签名: pub fn interpolate_rectilinear(wi
这个问题在这里已经有了答案: The trait bound `futures::Future, Error=Box>: Send` is not satisfied (1 个回答) Sending
我是一名优秀的程序员,十分优秀!