问题标签 [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 投票
2 回答
306 浏览

rust - 获取 Rc>> 关于子类型

我有以下定义:

我想实现这种功能:

我想有一种方法来返回共享相同对象的值,这意味着使用这些声明:

调用x.f()并将y.f()调用应用于同一对象。

我如何实现该功能convert或如何更改类型定义以具有该行为和那种转换(转换为子对象)。

0 投票
1 回答
176 浏览

rust - 为什么有些特质不能做成对象

我了解何时可以将特征制成特征对象的规则,但我不明白为什么存在这些规则。

例如:

在我看来,这三个特征基本上都封装了相同的功能。那么为什么不允许这些:

但这是?

有人可以解释一下引擎盖下发生了什么,以免它看起来很随意吗?

锈操场

0 投票
0 回答
542 浏览

rust - 为什么在闭包中没有将值转换为具有动态调度的特征对象?

给定以下代码:

编译器会抱怨:

但它通过替换来工作seq

代码可以在这里测试。

唯一的区别是失败示例中使用了闭包,而另一个使用(命名?)函数,但逻辑是相同的。这似乎是一生的问题,但一直无法弄清楚。此外,Option::map应该急切地消耗价值,然后应该立即使用闭包。

为什么闭包示例失败?

0 投票
0 回答
87 浏览

rust - 如何更改动态调度/特征对象的数据指针?

我有一个Vec<u8>命名和一个名为typevec的变量。我希望 的数据指针指向.x&dyn Traitxvec

我正在尝试开发像 JVM 这样的虚拟机。每个实现所需特征 ( or ) 的结构 ( Point, )实际上都是一条指令 ( , , ...) 将实现该特征,该特征包含指令本身的代码。LineDisplayDebugAddMovInstruction

这是另一个更接近我想要做的例子:

多个struct不同长度的 s 将与Vec<u8>. 在这个例子中, my structs 的内存布局可能与我想象的不匹配,但这并不重要,因为它们的布局不需要在编译时知道,而只需要在运行时知道。将其Vec<u8>视为程序从文件中读取的字节,而文件本身是由同一程序创建的。

即使它是不安全或未定义的行为并且不使用智能指针/堆分配,我该怎么做?

0 投票
0 回答
54 浏览

rust - 对函数返回的数据创建条件视图或代理

我有一个 JSON 对象,它代表一些松散的配置。我想提供基于某些运行时条件的数据“视图”功能,而不是直接处理数据。

在某些情况下,我仍然需要处理“原始”数据,因此我不想保留相同内容的副本和多次解析。

例如,我有一个这样的婴儿 JSON:

我正在将数据解析为与此类似的对象树:

链接到游乐场

我想要一种方法来返回与MessageType.

例如,当消息是工具栏时,它还具有其他属性中的“颜色”属性。

我想为它定义一个特征(或其他东西?)Toolbar并“投射” Message(或返回一些代理)以帮助处理非常松散的Message类型。

这是一个人为的例子

0 投票
2 回答
1032 浏览

generics - 特征对象如何将具有泛型方法的特征作为参数?

所以特征对象不能有泛型的方法——看起来不错。但是在这种语言中,使用抽象机制的唯一方法是通过泛型和特征对象。这意味着对于每个特征,我必须事先决定它是否可以用作对象,并在任何地方使用 dyn 而不是 impl。并且它内部的所有特征都必须以相同的方式来支持这一点。这种感觉非常难看。您能提出什么建议或告诉我为什么要这样设计吗?

0 投票
1 回答
613 浏览

rust - 如何处理 trait 对象中的 Sized 要求?

我无法理解 Rust 中的特征和对象安全性。

我有一个StoreTrait用于存储一些数据的Resource结构和一个包含对 a 的引用的结构StoreTrait

我希望Resource有对实例的引用store,因为Resource将使用的许多方法store,并且我不想显式传递store给 上的每个方法Resource

我还需要将逻辑驻留在特征中,因为我有各种需要共享它的实现(内存中和磁盘存储)。所以把它移到 impl 中并不是我想要的。

Storetrait 中,我尝试传递&Self给一个函数,但它失败了,因为&Selfis not Sized

这可能会成为 XY 问题

编译器建议where Self: Sized在这些方法中使用边界。但是,这在稍后save_resource()从 a调用时会导致另一个问题Resource,因为这意味着我正在调用带有Sized边界的 trait 对象上的方法。

操场

如何规避设置特征界限?或者如何防止在 trait 对象上调用方法?也许我正在做其他没有意义的事情?

编辑:我最终改变了函数的参数。每当我使用&dyn StoreTrait时,我都会切换到&impl StoreTrait. 这意味着每个实现都会编译具有该签名的函数,这使得二进制文件更大一些,但它现在sized可以满足要求。耶!

0 投票
2 回答
882 浏览

oop - 具有 Box 字段并实现异步特征的 Rust 结构

我遇到了具有 Box 字段和 impl 异步特征的结构的问题。具体来说

看起来发生错误是因为我在 impl 是异步特征的结构中使用了 Box 字段。

以下是我要完成的工作和遇到的问题的一个最小示例。你可以在这里找到它的游乐场。

首先,我该如何解决这个问题?

其次,我本质上是在尝试为结构编写特征,以便可以轻松地将 impl'ing 结构与其他结构交换出来,类似于我在 Java 中为对象编写接口的方式。我意识到这可能不是我在 Rust 中考虑组件设计的方式,但我是一个初学者,不确定什么是处理基于 trait 的设计的正确方法。如果这不是惯用的 Rust,您将如何重新设计它以使其仍能实现设计目标(在堆栈上下创建和使用特征以允许简单的 impl 交换)?

谢谢。

0 投票
1 回答
304 浏览

concurrency - Rust 缓存异步特征

当我尝试缓存一个值,只要它是有效的,并在它变得无效时更新它,我就会遇到一个问题。我相信这个问题是由于我试图在异步执行之间共享状态。此外,该组件存在于多线程/并发环境中。

我看到的我不知道如何解决的错误是

以下是我可以提出的一个最小示例(它还具有一些所有权问题),它通常捕获了我的用例和我看到的问题。 是代码的游乐场。

我不确定如何在示例中包含此内容,但main可以想象多个工作线程同时/并行运行每个调用CredsProvider.get_creds,然后使用这些凭据执行一些工作(如果您可以将其添加到完整的工作示例中,那就是非常感谢我的熏陶)。假设MyCredsProvider.inner_get_creds是昂贵的,并且应该只在缓存的凭据过期时调用。

我该如何解决这个问题?我以为Arc<Mutex<>>这就足够了,但似乎还不够。有一次,我尝试制作Creds和特质,以便我可以拥有Arc<Mutex<Option<Box<dyn Creds + Send + Sync>>>>,但感觉像是错误的道路并且没有奏效。

谢谢。

0 投票
0 回答
55 浏览

rust - 是否可以在包含 FnMut 闭包特征对象的结构上调用克隆?

我有一个循环将项目从队列中弹出,使用项目调用回调,然后需要将项目重新添加到队列中。这样做的原因是这些项目实际上是重复计时器,但是为了简洁起见,我在这个简单的示例中删除了所有计时器代码。是否可以在移动项目后克隆项目,或者有更好的方法来处理这个问题?