小编dos*_*pro的帖子

是否可以将 trait 对象转换为另一个 trait 对象?

我尝试了以下代码:

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)

casting dynamic rust

8
推荐指数
1
解决办法
4135
查看次数

读取固定大小的块中的二进制文件并将所有这些块存储到Vec中的正确方法是什么?

我在打开文件时遇到麻烦。大多数示例将文件读入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是解决此问题的正确类型。我的意思是,读取文件后,不需要数组增长。

binary file rust

4
推荐指数
2
解决办法
417
查看次数

wxWidgets绘制实时图形的最佳控件

我使用 SDL 制作了一个小应用程序来显示一些精灵动画,效果非常好。渲染尽可能平滑非常重要。

由于现在我需要一些 GUI,我决定使用 wxWidgets 3 创建类似的应用程序,但现在我还可以添加一些 GUI 元素,如菜单、模式等。

在深入研究 wxWidget 的 wiki 后,我发现有不同的方法可以绘制到窗口中。

例如:

  • wxClientDC
  • wxPaintDC
  • wxGLCanvas

我还发现了其他类型的类,例如“图形上下文类”,我仍然不确定它们是否对我的需要有用。

我的应用程序已经使用了一个只需要复制的内部缓冲区。

所以我的问题是在 wxWidgets 上执行此操作最合适的方法是什么?而且,该解决方案会带来多少性能/开销?

wxWidgets 在窗口内绘制像素的不同方法之间的性能/开销有何差异?为什么有人使用 OnPaint 事件,而其他人则不使用。

c++ wxwidgets

3
推荐指数
1
解决办法
2179
查看次数

如何克隆 Rc 特征对象并将其转换为另一个特征对象?

这是来自不同 taits 之间的 Rust dynamic cast trait object的后续问题。当我们对 trait 对象使用引用时,那里提供的解决方案非常有效,但这次我试图用Rc指针做同样的事情。例如

  • 我有一个名为的超级特征TraitAB和 2 个名为TraitA和的特征TraitB
  • 所以当我第一次创建一个 trait 对象TraitAB而不是使用 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)

casting smart-pointers rust trait-objects

3
推荐指数
1
解决办法
601
查看次数

标签 统计

rust ×3

casting ×2

binary ×1

c++ ×1

dynamic ×1

file ×1

smart-pointers ×1

trait-objects ×1

wxwidgets ×1