问题标签 [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 回答
254 浏览

rust - 如何共享堆分配的特征对象?

我有一个特征和一个实现该特征的结构(一个特征对象)。我想在堆上分配我的特征对象并让其他结构引用它们。

框字段

这段代码有效,但我不能让两个球体共享相同的Material,因为Box拥有材料,球体拥有它的Box场。

参考字段

我的下一个尝试是使用普通参考而不是Box

这也有效,但据我了解,我Material的 s 将分配在堆栈而不是堆上。如果Material值真的很大而且我宁愿把它放在堆上怎么办?这导致我采用下一种无法编译的方法:

引用框

这给了我以下错误:

我不太确定'static该类型的来源,并且看起来它混淆了类型检查器。否则dyn MaterialIron据我所知可以统一。

操场

0 投票
3 回答
701 浏览

rust - 如何在选项中引用特征对象?

我想在结构中存储对io::Write特征对象的引用,Option但我不知道如何。我可以像这样直接放入参考:

然后从(例如)BufWriter这样分配它:

这可行,但我希望它logstream是可选的。如果我尝试:

我得到:

这里有什么合适的方法?

0 投票
2 回答
781 浏览

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

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

  • 我有一个名为的超级特质TraitAB和两个名为TraitA和的特质TraitB
  • 所以当我第一次创建一个类型的特征对象TraitAB而不是使用 aBox时,现在我使用了一个Rc指针。
  • 我需要一个类型的变量TraitA作为参考ab

在这里,我做了一个非常简单的例子:

但这不起作用。根据错误信息:

as_a并且as_b不知道 self 实际上是一个Rc指针。有没有办法对克隆的共享指针进行强制转换?

0 投票
1 回答
221 浏览

lambda - 将 lambda 返回迭代器存储在结构中

我想将返回迭代器的 lambda 存储在结构中。需要 lambda 是因为并非所有容器都实现了iter()函数(例如String::chars()),所以我需要一种通用的方法来从容器中获取迭代器。

不幸的是,我收到以下错误:

我希望我理解它的含义,但我不知道如何解决它。

0 投票
1 回答
194 浏览

rust - 哪些 Rust 1.2 容器支持 trait 对象?

在 Rust 版本指南中,它说在 Rust 1.2 中,更多的容器类型支持 trait 对象。它给出了 的例子Rc<T>,但没有给出完整的列表。还有哪些其他容器支持 Rust 1.2+ 中的 trait 对象?

0 投票
2 回答
1154 浏览

generics - 在 trait 对象中使用泛型类型参数的引用问题是什么?

我正在阅读特征对象需要对象安全,但我不理解泛型类型参数的问题。

使用 trait 时用具体类型参数填充的泛型类型参数也是如此:具体类型成为实现 trait 的类型的一部分。当通过使用 trait 对象忘记类型时,无法知道用什么类型填充泛型类型参数。

我正在尝试编写一个示例,但我无法理解它。泛型类型参数有什么用?

我试图从参数化特征中创建特征对象,但是一旦为参数赋予了具体值,它就可以正常工作:

(编译良好,除了“未使用”警告)

我不明白这是什么意思“使用特征时用具体类型参数填充的泛型类型参数”以及泛型类型如何丢失(因为特征本身“携带”它们)。如果你能写一个段落中描述的案例的例子,我将不胜感激。

0 投票
3 回答
2489 浏览

generics - 为什么不能将 `&(?Sized + Trait)` 转换为 `&dyn Trait`?

在下面的代码中,不可能从实现相同特征的动态大小类型的引用中获得对特征对象的引用。为什么会这样?如果我可以同时使用两者来调用 trait 方法,这两者&dyn Trait之间到底有什么区别?&(?Sized + Trait)

实现的类型FooTraitContainerTrait可能例如具有type Contained = dyn FooTraittype Contained = T在哪里T实现的具体类型FooTrait。在这两种情况下,获得一个&dyn FooTrait. 我想不出另一种这种方法行不通的情况。为什么在一般情况下这不可能FooTraitContainerTrait

取消注释该foo_dyn(some_foo)行会导致编译器错误

0 投票
1 回答
2164 浏览

generics - 特质不能变成对象

我正在研究光线追踪器,并希望对所有可命中对象进行建模以提供通用接口。

我实现了一个名为 Object 的特征,所有可命中对象都实现了该特征。我创建了一个名为 Intersection 的结构,其中包含一个 f32 值和一个对实现 Object trait 的结构的引用。

编码:

错误信息如下:

由于我在 Intersection 中存储了一个引用,我认为它不必处理结构的实际大小。

0 投票
1 回答
552 浏览

rust - 为什么不能将 &str 传递给接受 &dyn 显示特征对象的函数?

我正在读一本 Rust 书,我对这个例子感到困惑:

&'static str作为特征对象传递失败:

为什么这会失败并且第二次调用有效?

0 投票
1 回答
387 浏览

rust - 如何迭代 trait 对象或无大小类型的元组

这个问题最初是在 reddit 的这篇文章中找到的。

虽然有经验的 Rust 用户会发现元组中的元素不必相同(如果是,则应该使用数组!),因此迭代它们没有意义,但在某些情况下仍然存在这种情况很有用。

这些情况是元组的类型可以转换为相同的未调整大小的类型(例如[u8]or dyn Trait)。

演示:

我找不到写上述内容的好方法。任何想法?


要查看一个不够漂亮的可能答案,这里是:

游乐场链接