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

rust - trait 对象的 &mut 和 ref mut 之间的区别

首先,我不是在问&mutref mut本身有什么区别。

我问是因为我想:

是相同的

考虑从函数返回一个特征对象。您可以返回 aBox<Trait>或 a &Trait。如果您想对其方法进行可变访问,是否可以返回&mut Trait

给定这个例子:

该方法接收一个可变引用用于演示目的。

这不会编译:

也不是这个:

但这将编译并工作:

我的理论

此示例将使用不可变引用开箱即用(无需将其分配给变量,只需 return &English)但不适用于可变引用。我认为这是由于规则只能有一个可变引用或尽可能多的不可变引用。

在不可变引用的情况下,您正在创建一个对象并将其作为返回表达式借用;它的引用不会因为它被借用而死。

在可变引用的情况下,如果您尝试创建一个对象并可变地借用它作为返回表达式,那么您有两个可变引用(创建的对象及其可变引用)。由于您不能对同一个对象有两个可变引用,因此它不会执行第二个,因此该变量不会存在足够长的时间。我认为当您编写let mut ref b = English并返回时,b您正在移动可变引用,因为它是由模式捕获的。

以上所有内容都是向自己解释它为什么有效的糟糕尝试,但我没有基础知识来证明它。

为什么会这样?

我也将这个问题交叉发布到 Reddit

0 投票
1 回答
636 浏览

rust - 为什么使用 Option::map 到 Box::new 一个特征对象不起作用?

Rustc 1.23.0。为什么第一种方法不能编译?我是否遗漏了一些明显的东西,或者......嗯?

0 投票
0 回答
180 浏览

oop - 如何在 BinaryHeap 中使用特征对象?

我有以下简化代码:

基本思想是使用 (unique) ids 进行排序。

堆初始化导致以下错误:

我刚刚开始尝试 Rust 并且拥有 OOP/C++/Java 背景。目的是将HasJob特征用作“接口”并使用它来诱导类型擦除/动态调度 wrt 通用集合/容器 - 一种常见的 OOP 模式。

如果我理解正确,泛型参数BinaryHeap具有传递给它的具体类型需要实现Ord特征的约束。试图用所需的特征扩展原始特征,像这样......

... 违反了 Rust 的对象安全保证并引发此编译器错误:

如何解决上述问题?

0 投票
1 回答
847 浏览

types - 所有 trait 对象的默认 trait 方法实现

我有一个 trait MyTrait,我希望所有的 trait 对象&MyTrait都可以相互比较,而不是其他任何东西。我现在基于如何测试特征对象之间的相等性?.

问题是我需要在MyTraitComparable任何地方使用,而不是MyTrait. 有没有办法解决这个问题?

我尝试移动as_anyequals提供MyTrait默认实现,但是

  • 我认为我不能self在那种情况下使用,所以它不起作用。
  • 如果我使用trait MyTrait: PartialEq,那么我将无法再创建特征对象。
0 投票
0 回答
51 浏览

rust - 如何将特征对象转换为“子特征”对象?

这段代码:

失败并出现错误:

为什么?既然B需要A,不应该所有的特征对象都&B自动实现&A吗?有没有办法在不更改特征定义或实现的情况下转换&B为?&A

操场

0 投票
2 回答
3875 浏览

rust - 无法克隆 Vec> 因为 Trait 不能成为对象

我正在尝试克隆盒装特征的向量。自然,简单地推导Clone实现我的特征的所有结构是不够的,因为编译器在编译时并不知道所有实现该特征的结构都具有Clone.

好的,然后我尝试将Clone其用作超特征,但这只会导致标题错误。我不知所措。

这是最小工作实现(或不工作,因为我无法克隆)

出现此错误:

这里是操场的链接,便于代码运行。

我也尝试在a中制作elements矢量,但这也不起作用。SequenceVec<Box<MusicElement + Clone>>

我无法在网上找到任何有用的解决方案,所以这是我的问题:如何使代码可克隆?

0 投票
3 回答
697 浏览

rust - 如何使用具有关联类型的非静态特征对象?

我有这种类型:

我想实现std::ops::Index并返回对特征对象的引用。这是我的第一次尝试(游乐场):

这不起作用并导致此错误:

我想我知道为什么会发生这种情况:type Output = Display相当于type Output = Display + 'static每个 trait 对象都有一个默认为'static.

所以现在我可以将'static绑定添加到我的参数T,但我认为这是过度约束。当不使用关联类型时,我可以轻松实现这样的方法:

不需要'static限制,因为现在签名去糖:

这是有道理的:特征对象必须至少存在'a. (带有所有代码的游乐场)。


但是我可以使用关联类型(如Index特征)来完成这项工作吗?我觉得这可能适用于泛型关联类型,但是(a)我不确定并且(b)它们还没有实现。

0 投票
1 回答
402 浏览

reference - 是否可以通过 Arc> 不使用类型参数的函数?

我必须将 a 传递Arc<RwLock<&Fn()>>给函数:

锈游乐场

编译失败并显示错误消息:

关闭不是Fn吗?

我努力了:

  • 用引用替换Arc<RwLock>(导致&&Fn())。这仅在您删除函数签名中的一个&符号时才有效execute(),但这并没有真正帮助我,因为出于我不想在这里解释的原因,我需要那些包装器。锈游乐场
  • 将函数签名中的Fn()in移动execute()到 where 子句中:

    这也有效,我也不能使用 where 子句(因为我需要在结构中使用它,但在结构中没有 where 子句)。

  • 结合前面的两个想法:Arc<RwLock<&&Fn()>>在函数签名中传递 a 并删除一个 & 符号。那将是我所需要的,但它也失败了。
  • 铸造wrapped_closure成(这是这里Arc<RwLock<&Fn()>>类似问题的解决方案)。这失败了,因为它是“非原始演员表”

是否可以在不添加类型参数和 where 子句的情况下传递Arc<RwLock<&Fn()>>in Rust?如果是,如何?

0 投票
1 回答
915 浏览

rust - 如何将值移出对象安全的特征对象?

AMech携带一个驱动程序,它是一个Named实体。在运行时,省略的Mech构造函数会咨询外部源以获取要使用的特定类型的驱动程序。

方法driver_name将所有权返回给 a String,以便在链式调用中进一步使用它(在实际代码中它是 a Command)。它编译失败:

使特征Sized无法实现对象安全:

↓</p>

有没有办法让这种模式发生?

我似乎缺少什么基本的东西吗?

如果这是不可能实现的,有什么好的方法可以解决它?

0 投票
1 回答
336 浏览

rust - 如何从另一个 trait 对象创建一个 trait 对象?

Rust 的最新稳定版本(1.27)允许为特征对象(dyn Trait)实现特征,所以我尝试了以下方法:

上面的代码导致错误:

这是令人困惑的,因为&T1它是一个实例,dyn T1所以有一个T2实现。f2我们甚至可以通过我们可以直接调用的事实来见证这一点t12,因为删除最后两main行使其可以编译。

是否可以从标记为不同特征的特征对象创建特征对象?