我尝试了以下代码:
trait TraitA {
fn say_hello(&self) {
self.say_hello_from_a();
}
fn say_hello_from_a(&self);
}
trait TraitB {
fn say_hello(&self) {
self.say_hello_from_b();
}
fn say_hello_from_b(&self);
}
struct MyType {}
impl TraitA for MyType {
fn say_hello_from_a(&self) {
println!("Hello from A");
}
}
impl TraitB for MyType {
fn say_hello_from_b(&self) {
println!("Hello from B");
}
}
fn main() {
let a: Box<dyn TraitA> = Box::new(MyType {});
let b: Box<dyn TraitB>;
a.say_hello();
b = a;
b.say_hello();
}
Run Code Online (Sandbox Code Playgroud)
我收到以下编译错误:
error[E0308]: mismatched types
--> src/main.rs:34:9
|
34 …Run Code Online (Sandbox Code Playgroud) 我在打开文件时遇到麻烦。大多数示例将文件读入String或将整个文件读入Vec。我需要将文件读取为固定大小的块,并将这些块存储到块的数组(Vec)中。
例如,我有一个my_file大小恰好为64 KB 的文件,我想以16KB的块大小读取它,因此我最终得到一个Vec大小为4的文件,其中每个元素都是另一个Vec大小为16Kb(0x4000字节)的文件。
在阅读了文档并检查了其他Stack Overflow答案之后,我能够提供以下内容:
let mut file = std::fs::File::open("my_file")?;
// ...calculate num_of_chunks 4 in this case
let list_of_chunks = Vec::new();
for chunk in 0..num_of_chunks {
let mut data: [u8; 0x4000] = [0; 0x4000];
file.read(&mut data[..])?;
list_of_chunks.push(data.to_vec());
}
Run Code Online (Sandbox Code Playgroud)
尽管这似乎可以很好地工作,但看起来有点令人费解。我读:
Vec,然后将其移动Vec到中list_of_chunks Vec。我不确定这是不是惯用的,甚至是可能的,但我宁愿这样:
Vecwith num_of_chunk元素,其中每个元素Vec的大小均为16KB。Vec没有复制,我们在读取文件之前确保已分配内存。
那可能吗?还是有更好的常规/惯用/正确方法来做到这一点?我想知道是否Vec是解决此问题的正确类型。我的意思是,读取文件后,不需要数组增长。
我使用 SDL 制作了一个小应用程序来显示一些精灵动画,效果非常好。渲染尽可能平滑非常重要。
由于现在我需要一些 GUI,我决定使用 wxWidgets 3 创建类似的应用程序,但现在我还可以添加一些 GUI 元素,如菜单、模式等。
在深入研究 wxWidget 的 wiki 后,我发现有不同的方法可以绘制到窗口中。
例如:
我还发现了其他类型的类,例如“图形上下文类”,我仍然不确定它们是否对我的需要有用。
我的应用程序已经使用了一个只需要复制的内部缓冲区。
所以我的问题是在 wxWidgets 上执行此操作最合适的方法是什么?而且,该解决方案会带来多少性能/开销?
wxWidgets 在窗口内绘制像素的不同方法之间的性能/开销有何差异?为什么有人使用 OnPaint 事件,而其他人则不使用。
这是来自不同 taits 之间的 Rust dynamic cast trait object的后续问题。当我们对 trait 对象使用引用时,那里提供的解决方案非常有效,但这次我试图用Rc指针做同样的事情。例如
TraitAB和 2 个名为TraitA和的特征TraitBTraitAB而不是使用 a 时Box,现在我使用了一个Rc指针。TraitA作为参考ab在这里,我做了一个非常小的例子:
use std::rc::Rc;
trait TraitAB: TraitA + TraitB {
fn as_a(&self) -> Rc<dyn TraitA>;
fn as_b(&self) -> Rc<dyn TraitB>;
}
trait TraitA {}
trait TraitB {}
struct MyType {}
impl TraitAB for MyType {
fn as_a(&self) -> Rc<dyn TraitA> {
Rc::clone(self)
}
fn …Run Code Online (Sandbox Code Playgroud)