- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是Rust的新手,使用“Trait Object”时遇到了问题...
现在,我有带有App
字段的panels
结构,这是实现WavePanel
特性的Panel
结构的Vec。
由于我有更多实现Panel
的工具,因此我希望panels
变得更通用。
因此,我尝试将Panel
指定为该字段的Trait对象,但是它不起作用...。
这是当前的外观(更改之前):
https://github.com/minagawah/perlin-experiment/blob/6e8064140daedc0767733898621c951619ff4467/src_for_wasm/perlin-wave/src/app.rs#L14
use crate::panels::wave::WavePanel;
use crate::panels::Panel;
#[derive(Clone, Debug)]
pub struct App {
points: Vec<Point>,
points_prev: Vec<Point>,
panels: Vec<WavePanel>, // <-- `WavePanel` struct works just fine.
}
impl App {
pub fn new(config: &Config) -> Result<Self, String> {
let color: String = config.color.clone();
let color2: String = config.color2.clone();
let mut panels = vec![];
for panel in &config.panels {
let id = panel.id.clone();
match id.as_str() {
"wave" => {
panels.push(WavePanel::new(
id.as_str(),
color.as_str(),
color2.as_str(),
)?);
}
_ => {}
}
}
Ok(App {
points: vec![],
points_prev: vec![],
panels: panels,
})
}
}
这是
Panel
特性:
pub trait Panel<G: Graphics> {
fn g(&self) -> Rc<RefCell<G>>;
fn reset(&mut self) {
if let Ok(mut g) = self.g().try_borrow_mut() {
let (width, height) = g.size();
g.reset(width, height);
};
}
}
这是
WavePanel
实现
Panel
特性的方式:
#[derive(Clone, Debug)]
pub struct WavePanel {
id: String,
g: Rc<RefCell<WaveGraphics>>,
graph_type: Rc<Cell<GraphType>>,
}
impl Panel<WaveGraphics> for WavePanel {
fn g(&self) -> Rc<RefCell<WaveGraphics>> {
self.g.clone()
}
}
而且,这是我尝试过的内容(之后):
use crate::panels::wave::WavePanel;
use crate::panels::Panel;
#[derive(Clone, Debug)]
pub struct App {
points: Vec<Point>,
points_prev: Vec<Point>,
panels: Vec<Box<dyn Panel>>, // <-- This does not work...
}
impl App {
pub fn new(config: &Config) -> Result<Self, String> {
let color: String = config.color.clone();
let color2: String = config.color2.clone();
let mut panels = vec![];
for panel in &config.panels {
let id = panel.id.clone();
match id.as_str() {
"wave" => {
// Pushing it into Box this time.
panels.push(Box::new(
WavePanel::new(
id.as_str(),
color.as_str(),
color2.as_str(),
)?
));
}
_ => {}
}
}
Ok(App {
points: vec![],
points_prev: vec![],
panels: panels,
})
}
}
这是错误:
error[E0107]: wrong number of type arguments: expected 1, found 0
--> src/app.rs:15:25
|
15 | panels: Vec<Box<dyn Panel>>,
| ^^^^^ expected 1 type argument
error: aborting due to previous error
For more information about this error, try `rustc --explain E0107`.
error: could not compile `perlin-wave`
Box<dyn Panel>
应该不够明确吗?
Panel
而是
Panel<G: Graphics>
,它们是完全不同的。
G
喂给
Panel
特质,然后将
G
替换为
dyn Graphics
(对于
g
字段),这就是问题!
WavePanel
特性的
Panel
结构推到
panels: Vec<Box<dyn Panel>>
时,出现了错误消息:
expected trait object "dyn Panel", found struct "WavePanel"
。这是关于实现异构vec的问题,这不是kmdreko的错。至于原始问题,kmdreko的答案应该是正确的答案。
WavePanel
结构而不是
dyn Panel
Trailt对象有关。就在我创建
Box::new(WavePanel::new(..))
时,现在我明确告诉我要特征对象
Vec<Box<dyn Panel>>
,并对其进行了修复。
g
中有一个
Panel
字段,现在在
dyn Graphics
中有
G
而不是
Panel
。现在
Graphics
特征也发生了类似的情况。就像我对
WavePanel
特质使用
Panel
结构一样,我对
WaveGraphics
特质也使用
Graphics
结构。在某种程度上,Rust现在与
g
中定义的
Panel
字段的类型混淆了。为此,我决定派生
Any
特性的
Graphics
特性。只要我定义
as_any_mut()
始终返回
Any
特质中的
Graphics
结构,当我实际要使用它(例如
g.draw()
)时,我总是可以将trait对象转换为
Any
,并执行此操作:
g.as_any_mut().downcast_mut::<WaveGraphics>()
。
最佳答案
Shouldn't
Box<dyn Panel>
be explicit enough?
Panel
定义为通用;
Panel<A>
和
Panel<B>
是不同的特征。如果您希望使用
Panel
而不管图形类型如何,则不能通用。
g()
仅在支持
reset()
的位置,则可以将其删除:
pub trait Panel {
fn reset(&mut self);
}
impl Panel for WavePanel {
fn reset(&mut self) {
if let Ok(mut g) = self.g.try_borrow_mut() {
let (width, height) = g.size();
g.reset(width, height);
};
}
}
或者,如果仍然需要
g()
来获取一般的图形对象,则也可以使其动态化:
pub trait Panel {
fn g(&self) -> Rc<RefCell<dyn Graphics>>;
// ^^^^^^^^^^^^
fn reset(&mut self) {
if let Ok(mut g) = self.g().try_borrow_mut() {
let (width, height) = g.size();
g.reset(width, height);
};
}
}
impl Panel for WavePanel {
fn g(&self) -> Rc<RefCell<dyn Graphics>> {
self.g.clone()
}
}
关于rust - 将特征对象用于结构-错误: wrong number of type arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66405385/
从 angular 5.1 更新到 6.1 后,我开始从我的代码中收到一些错误,如下所示: Error: ngc compilation failed: components/forms/utils.
我正在学习 Typescript 并尝试了解类型和接口(interface)的最佳实践。我正在玩一个使用 GPS 坐标的示例,想知道一种方法是否比另一种更好。 let gps1 : number[];
type padding = [number, number, number, number] interface IPaddingProps { defaultValue?: padding
这两种格式在内存中保存结果的顺序上有什么区别吗? number = number + 10; number += 10; 我记得一种格式会立即保存结果,因此下一行代码可以使用新值,而对于另一种格式,
在 Python 匹配模式中,如何匹配像 1 这样的文字数字在按数字反向引用后 \1 ? 我尝试了 \g用于此目的的替换模式中可用的语法,但它在我的匹配模式中不起作用。 我有一个更大的问题,我想使用一
我的源文件here包含 HTML 代码,我想将电话号码更改为可在我的应用程序中单击。我正在寻找一个正则表达式来转换字符串 >numbernumber(\d+)$1numbernumber<",我们在S
我们有一个包含 2 个字段和一个按钮的表单。我们想要点击按钮来输出位于 int A 和 int B 之间的随机整数(比如 3、5 或 33)? (不需要使用 jQuery 或类似的东西) 最佳答案 你
我收到以下类型错误(TypeScript - 3.7.5)。 error TS2345: Argument of type '(priority1: number, priority2: number
只想创建简单的填充器以在其他功能中使用它: function fillLine(row, column, length, bgcolor) { var sheet = SpreadsheetApp
我有一个问题。当我保存程序输出的 *.txt 时,我得到以下信息:0.021111111111111112a118d0 以及更多的东西。 问题是: 这个数字中的“d0”和“a”是什么意思? 我不知道“
首先:抱歉标题太长了,但我发现很难用一句话来解释这个问题;)。是的,我也四处搜索(这里和谷歌),但找不到合适的答案。 所以,问题是这样的: 数字 1-15 将像这样放在金字塔中(由数组表示):
我想从字符串中提取血压。数据可能如下所示: text <- c("at 10.00 seated 132/69", "99/49", "176/109", "10.12 I 128/51, II 1
当尝试执行一个简单的 bash 脚本以将前面带有 0 的数字递增 1 时,原始数字被错误地解释。 #!/bin/bash number=0026 echo $number echo $((number
我有一个类型为 [number, number] 的字段,TypeScript 编译器(strict 设置为 true)出现问题,提示初始值值(value)。我尝试了以下方法: public shee
你能帮我表达数组吗:["232","2323","233"] 我试试这个:/^\[("\d{1,7}")|(,"\d{1,7}")\]$/ 但是这个表达式不能正常工作。 我使用 ruby(rail
这个问题在这里已经有了答案: meaning of (number) & (-number) (4 个回答) 关闭6年前. 例如: int get(int i) { int res = 0;
我正在考虑使用 Berkeley DB作为高度并发的移动应用程序后端的一部分。对于我的应用程序,使用 Queue对于他们的记录级别锁定将是理想的。但是,如标题中所述,我需要查询和更新概念建模的数据,如
我正在尝试解决涉及重复数字的特定 JavaScript 练习,为此我需要将重复数字处理到大量小数位。 目前我正在使用: function divide(numerator, denominator){
我有这个数组类型: interface Details { Name: string; URL: string; Year: number; } interface AppState {
我们正在使用 Spring 3.x.x 和 Quartz 2.x.x 实现 Web 应用程序。 Web 服务器是 Tomcat 7.x.x。我们有 3 台服务器。 Quartz 是集群式的,因此所有这
我是一名优秀的程序员,十分优秀!