问题标签 [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 - 为什么向 trait 添加泛型类型会影响 trait 对象和关联类型的生命周期?
我有以下代码:
这会引发这些错误:
如果我GT
从任何地方删除,它编译得很好,但GT
它会因一堆生命周期错误而失败。似乎 of 的存在不GT
应该影响dyn T
orT::AT
的生命周期(因为它没有在其中使用),但显然确实如此。同样,生命周期不dyn T
应该依赖于生命周期,GT
但AT
它显然确实如此。
我错过了什么还是终身推理问题?
rust - 除非我使用临时变量,否则为什么我不能推入 Vec 的 dyn Trait?
这是我的代码:
v.push(x)
引发此错误:
但是,如果我将值(用完全相同的值和类型构造)直接推送到向量中,它会编译而不会出错。
那么为什么第一个版本不编译呢?我应该改变什么才能使它x
在推入向量之前可以使用?
rust - Vec 和 HashMap 之间的特征对象差异
我一直在努力理解为什么以下代码的行为方式(Playground):
这会引发错误:
对我来说奇怪的事情并不完全是错误,而是错误只显示来自迭代器HashMap
而不是来自Vec
迭代器的列表值。有人可以向我解释一下:
- 为什么这两个结构的迭代器表现如此不同
- 我如何将地图中的值传递到我的数组中
我发现通过get
调用检索任何值也会发生同样的现象。
generics - 将泛型方法转换为 trait 对象安全方法
我想制作一个删除通用参数(以生成特征对象)的适配器,如下例所示。
有没有办法在没有堆分配、只使用安全代码且没有外部依赖项的情况下完成此任务?
以下是我想要的想法,但借用检查器不允许这样做。
generics - 如何将特征对象传递给在向量的向量中也具有统一类型的向量?
这真的很难简明扼要地解释。但我想要的是一个结构,它有一个 Vec“A”字段,其中包含一个线程向量,在 Vec“A”内有另一个 Vec“B”。Vec "A" 拥有 Vec "B" 和线程句柄。Vec "B" 有一个统一的类型,不需要 trait 对象,但是 Vec "A" 使用 trait 对象拥有多个不同类型的 Vec "B"。基本上我不想对 Vec“B”使用特征对象,而是对 Vec“A”使用特征对象。
我试图实现上述内容,但并不总是感觉正确和错误。是否有任何实际实现或任何直接解决方法?
我确实尝试过搜索它,但我觉得如果不给谷歌写一段简短的文字,我就无法简洁地表达它。
这是我认为应该是什么样的(伪)代码:
rust - 如何转换`Arc` 变成 ` 弧线`?
我有一个库,它需要一些东西来实现特定的特征(TQDispatch
)。
在我的主要项目中,我有一个对象向量,它们都实现了Device
动态调度所需的不同特征 ( )。
声明了设备特征
我的期望是我可以从实现者列表中获取一个项目Device
并获得它的TQDispatch
特性,以便我可以将它传递给库。鉴于任何实现的东西Device
也都实现了TQDispatch
,这似乎应该是可能的。
我可以将原始的“真实”对象投射到任何一个,但我找不到如何在这两个特征之间进行投射。
澄清:这些Arc<dyn Device>
在我的项目向量中,我需要它们Arc<dyn TQDispatch>
用于库。
rust - 如何将 dyn FnMut 转换为自定义特征对象?
由于Fn
-like 特征可以多次实现,因此不能这样做:
我想做这样的事情,所以我尝试使用特征对象,因为我可以为它们实现特征:
Callable
这行得通,但我想为回调系统存储各种。我的第一个也是最好的尝试是使用 a Vec<Box<dyn Callable>>
,但似乎特征对象无法转换为他们实现的特征的特征对象。
这给了我:
我不明白。特征对象是类型,我Callable
为所有Fn(T)
特征对象实现了一个,您通常可以从特定实现的特征对象强制执行。
- 为什么它不起作用?
- 有解决方法吗?
Fn
特征参数类型是通用的且不相关的,这是有原因的吗?
边注
我想要这种系统来存储可以从环境中获取参数的任何闭包(不仅是函数),而不管参数的数量和类型如何。
我知道我可以:
- 允许采取
&Env
并让用户处理“提取”的闭包。 - 使用宏来创建我自己的直接实现的自定义闭包类型
Callable
。
rust - 如何将 Arc 克隆传递给闭包?
我正在尝试Arc
通过克隆来编写一个使用 an 的闭包。理想情况下,我希望将 clone 放在闭包内,但我有点被迫通过 original Arc
,这可能是我收到错误的原因:
错误:
我想改成
将强制关闭决定克隆a
,从而解决问题,但我得到同样的错误。
我怎样才能将一个传递Arc
给一个闭包?
generics - Rust 说函数参数的生命周期不够长,即使已经放置了适当的生命周期
对于背景上下文:我正在创建一个基于观察者/订阅者的全局事件系统(使用单个共享事件系统)。我决定FnMut
用作我的回调闭包。'a
放置在impl
临时结构的生存期Data<'a>
应该允许callback
方法中的参数mut_func()
与整个Data
结构一样长。因为callback
参数使用了F
肯定受生命周期约束的泛型'a
。但是错误仍然出现,表明callback
参数的寿命不够长。
我最初用作Box<T>
的容器dyn FnMut(u32)
,但Box<T>
需要回调'static
(因为我将装箱的泛型转换为盒子特征对象),这在我的场景中是无法实现的(为了可读性)。然后我尝试使用Rc<RefCell<T>>
which 可悲的是不支持 trait 对象。
另外,我使用泛型作为callback
参数,因为我希望该函数具有更高的可读性,而不是必须看到Box<T>
环绕无处不在的整个闭包,因为这个事件系统将是我程序的核心部分。我将尽一切努力使“前端”更具可读性和更清晰(除了显着的性能影响)。
注意:这是我的示例程序。如果需要,我可以发布实际程序。
错误:
例子:
generics - 由于泛型类型参数,无法将特征制成对象
在我的代码中,我有实现 Trait1 的对象。我还有各种实现 Trait2 的对象,它期望 Trait1 对象作为参数。当我尝试创建满足 Trait2 的对象向量时,出现编译器错误。
我能得到的最简单的复制:
这导致编译器错误:
有没有办法实现这样的目标?'myvec' 在 Trait2 上必须是动态的,因为我希望拥有实现此 trait 的不同类型。有没有办法让'obj'在 Trait1 上完全通用,或者我必须将它绑定到实现 Trait1 的一种特定类型?