问题标签 [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.

0 投票
1 回答
69 浏览

rust - 为什么向 trait 添加泛型类型会影响 trait 对象和关联类型的生命周期?

我有以下代码:

操场

这会引发这些错误:

如果我GT从任何地方删除,它编译得很好,但GT它会因一堆生命周期错误而失败。似乎 of 的存在不GT应该影响dyn TorT::AT的生命周期(因为它没有在其中使用),但显然确实如此。同样,生命周期不dyn T应该依赖于生命周期,GTAT它显然确实如此。

我错过了什么还是终身推理问题?

0 投票
1 回答
992 浏览

rust - 除非我使用临时变量,否则为什么我不能推入 Vec 的 dyn Trait?

这是我的代码:

v.push(x)引发此错误:

但是,如果我将值(用完全相同的值和类型构造)直接推送到向量中,它会编译而不会出错。

那么为什么第一个版本不编译呢?我应该改变什么才能使它x在推入向量之前可以使用?

0 投票
1 回答
110 浏览

rust - Vec 和 HashMap 之间的特征对象差异

我一直在努力理解为什么以下代码的行为方式(Playground):

这会引发错误:

对我来说奇怪的事情并不完全是错误,而是错误只显示来自迭代器HashMap而不是来自Vec迭代器的列表值。有人可以向我解释一下:

  1. 为什么这两个结构的迭代器表现如此不同
  2. 我如何将地图中的值传递到我的数组中

我发现通过get调用检索任何值也会发生同样的现象。

0 投票
1 回答
56 浏览

generics - 将泛型方法转换为 trait 对象安全方法

我想制作一个删除通用参数(以生成特征对象)的适配器,如下例所示。

有没有办法在没有堆分配、只使用安全代码且没有外部依赖项的情况下完成此任务?

以下是我想要的想法,但借用检查器不允许这样做。

0 投票
1 回答
138 浏览

generics - 如何将特征对象传递给在向量的向量中也具有统一类型的向量?

这真的很难简明扼要地解释。但我想要的是一个结构,它有一个 Vec“A”字段,其中包含一个线程向量,在 Vec“A”内有另一个 Vec“B”。Vec "A" 拥有 Vec "B" 和线程句柄。Vec "B" 有一个统一的类型,不需要 trait 对象,但是 Vec "A" 使用 trait 对象拥有多个不同类型的 Vec "B"。基本上我不想对 Vec“B”使用特征对象,而是对 Vec“A”使用特征对象。

我试图实现上述内容,但并不总是感觉正确和错误。是否有任何实际实现或任何直接解决方法?

我确实尝试过搜索它,但我觉得如果不给谷歌写一段简短的文字,我就无法简洁地表达它。

这是我认为应该是什么样的(伪)代码:

0 投票
1 回答
538 浏览

rust - 如何转换`Arc` 变成 ` 弧线`?

我有一个库,它需要一些东西来实现特定的特征(TQDispatch)。

在我的主要项目中,我有一个对象向量,它们都实现了Device动态调度所需的不同特征 ( )。

声明了设备特征

我的期望是我可以从实现者列表中获取一个项目Device并获得它的TQDispatch特性,以便我可以将它传递给库。鉴于任何实现的东西Device也都实现了TQDispatch,这似乎应该是可能的。

我可以将原始的“真实”对象投射到任何一个,但我找不到如何在这两个特征之间进行投射。

澄清:这些Arc<dyn Device>在我的项目向量中,我需要它们Arc<dyn TQDispatch>用于库。

0 投票
0 回答
40 浏览

rust - 如何将 dyn FnMut 转换为自定义特征对象?

由于Fn-like 特征可以多次实现,因此不能这样做:

我想做这样的事情,所以我尝试使用特征对象,因为我可以为它们实现特征:

Callable这行得通,但我想为回调系统存储各种。我的第一个也是最好的尝试是使用 a Vec<Box<dyn Callable>>,但似乎特征对象无法转换为他们实现的特征的特征对象。

这给了我:

我不明白。特征对象是类型,我Callable为所有Fn(T)特征对象实现了一个,您通常可以从特定实现的特征对象强制执行。

  • 为什么它不起作用?
  • 有解决方法吗?
  • Fn特征参数类型是通用的且不相关的,这是有原因的吗?

边注

我想要这种系统来存储可以从环境中获取参数的任何闭包(不仅是函数),而不管参数的数量和类型如何。

我知道我可以:

  • 允许采取&Env并让用户处理“提取”的闭包。
  • 使用宏来创建我自己的直接实现的自定义闭包类型Callable
0 投票
1 回答
293 浏览

rust - 如何将 Arc 克隆传递给闭包?

我正在尝试Arc通过克隆来编写一个使用 an 的闭包。理想情况下,我希望将 clone 放在闭包内,但我有点被迫通过 original Arc,这可能是我收到错误的原因:

错误:

我想改成

将强制关闭决定克隆a,从而解决问题,但我得到同样的错误。

我怎样才能将一个传递Arc给一个闭包?

0 投票
1 回答
80 浏览

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>环绕无处不在的整个闭包,因为这个事件系统是我程序的核心部分。我将尽一切努力使“前端”更具可读性和更清晰(除了显着的性能影响)。

注意:这是我的示例程序。如果需要,我可以发布实际程序。

错误:

例子:

0 投票
0 回答
49 浏览

generics - 由于泛型类型参数,无法将特征制成对象

在我的代码中,我有实现 Trait1 的对象。我还有各种实现 Trait2 的对象,它期望 Trait1 对象作为参数。当我尝试创建满足 Trait2 的对象向量时,出现编译器错误。

我能得到的最简单的复制:

这导致编译器错误:

有没有办法实现这样的目标?'myvec' 在 Trait2 上必须是动态的,因为我希望拥有实现此 trait 的不同类型。有没有办法让'obj'在 Trait1 上完全通用,或者我必须将它绑定到实现 Trait1 的一种特定类型?