问题标签 [trait-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rust - 如何将生命周期应用于 VecDeque>?
我正在尝试创建一个 VecDeque 结构,这些结构都实现了一个Animal
特征。此代码有效,但我不明白为什么添加' static
修复它以及如何使用它'a
。
两个问题:
- 有人可以解释如何
'a
正确使用以及这将如何工作/这意味着什么?而且我猜为什么我什至需要在这里度过一生(是因为我使用的是 Box)? - 我也很困惑为什么我必须使用
#[path="..."]
它,因为没有它,它会要求我将文件移动到src/lib/animal.rs
但是当我移动它时,它仍然不起作用。
rust - 如何将结构的 Vec 强制为特征对象的 Vec?
尝试创建一个HashMap
由向量组成的数据库结构。每个Vec
包含Box<dyn Model>
.
编译器产生以下错误:
为什么编译器不能推断User
并Message
实现Model
?
rust - “关联类型...必须指定”,但未使用
为什么这里需要关联类型,即使它从未使用过?
我明白了
rust - 如何通过对象安全方法中的动态调度传递闭包?
如何将闭包传递给对象安全的 trait 方法或通过动态调度?
我自己已经回答了这个问题,但答案留下了一些不足:FnOnce
闭包必须装箱,因为它们没有尺寸并且必须在使用时消耗(因此不能通过引用传递)。
rust - 有没有办法将随机数生成器存储为特征对象?
有没有办法在 Rust 中保存一个通用的随机数生成器?我想要一种编写通用代码的方法,例如:
该变量rng
使用种子或其他方式保存不同类型的随机数生成器。但是,此代码存在大量错误,例如:
因此,持有随机数生成器以便可以用另一个替换它的正确方法是什么?基本上,我想生成纯随机数,然后用种子替换生成器以进行调试。
rust - 如何将特征转换为具体类型?
我有一个特征对象,我想知道它指向的具体对象,但我不知道如何获取具体对象。
我想要的是如下内容:
这样我就可以说:
然后new_thing
将包含 的某种副本old_thing
,除非old_thing
是意外类型,在这种情况下它应该返回错误。
但是 Rust 不会让我Option<&SomeType>
从MyClonable
.
rust - 如何通过 Rc> 到想要 &dyn T 的 fn?
我无法将参数传递给 fn。
编译器告诉我:
我认为这就像rust book中的示例Rc
一样,其中自动取消引用并从我可以调用的 RefCell 中获取值borrow()
。
我也尝试过显式取消引用,但似乎没有任何效果。
如何调用foo()
中的每个dyn T
对象self
?
rust - 如何在不单独分配堆上的每个项目的情况下创建拥有的特征对象的列表?
我想要一个拥有的 Rust 特征对象列表。我可以将其实现为,Vec<Box<dyn Trait>>
但它会在堆上为每个特征对象分配空间。我更喜欢的是一种CompactList<dyn Trait>
具有如下内存表示的类型:
size*
是相应的字节大小data*
。
有了这个,我可以创建一个Iterator<Item = &dyn Trait>
. 我需要的唯一操作CompactList<T>
是push()
and iter()
。
generics - 铸弧> 到弧
我正在编写一个带有边和节点的图形实现。该图应同时访问,因此我选择将边和节点构建为Arc<Mutex<dyn Edge>>
和Arc<RwLock<dyn Node>>
.
不幸的是,在连接节点/边时出现编译错误the parameter type 'T' may not live long enough
(Playground )。
问题是:Arc<RwLock<T>>
应该不是参考,所以不应该有生命周期。将其转换为Arc<RwLock<dyn Node>>
也不会引入生命周期。
有人可以解释这个编译器错误吗?这个问题与每个参数类型(例如Type<T>
)有关还是仅与Arc<RwLock<T>>
?