问题标签 [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 对象的 &mut 和 ref mut 之间的区别
首先,我不是在问&mut
和ref mut
本身有什么区别。
我问是因为我想:
是相同的
考虑从函数返回一个特征对象。您可以返回 aBox<Trait>
或 a &Trait
。如果您想对其方法进行可变访问,是否可以返回&mut Trait
?
给定这个例子:
该方法接收一个可变引用用于演示目的。
这不会编译:
也不是这个:
但这将编译并工作:
我的理论
此示例将使用不可变引用开箱即用(无需将其分配给变量,只需 return &English
)但不适用于可变引用。我认为这是由于规则只能有一个可变引用或尽可能多的不可变引用。
在不可变引用的情况下,您正在创建一个对象并将其作为返回表达式借用;它的引用不会因为它被借用而死。
在可变引用的情况下,如果您尝试创建一个对象并可变地借用它作为返回表达式,那么您有两个可变引用(创建的对象及其可变引用)。由于您不能对同一个对象有两个可变引用,因此它不会执行第二个,因此该变量不会存在足够长的时间。我认为当您编写let mut ref b = English
并返回时,b
您正在移动可变引用,因为它是由模式捕获的。
以上所有内容都是向自己解释它为什么有效的糟糕尝试,但我没有基础知识来证明它。
为什么会这样?
rust - 为什么使用 Option::map 到 Box::new 一个特征对象不起作用?
Rustc 1.23.0。为什么第一种方法不能编译?我是否遗漏了一些明显的东西,或者......嗯?
oop - 如何在 BinaryHeap 中使用特征对象?
我有以下简化代码:
基本思想是使用 (unique) id
s 进行排序。
堆初始化导致以下错误:
我刚刚开始尝试 Rust 并且拥有 OOP/C++/Java 背景。目的是将HasJob
特征用作“接口”并使用它来诱导类型擦除/动态调度 wrt 通用集合/容器 - 一种常见的 OOP 模式。
如果我理解正确,泛型参数BinaryHeap
具有传递给它的具体类型需要实现Ord
特征的约束。试图用所需的特征扩展原始特征,像这样......
... 违反了 Rust 的对象安全保证并引发此编译器错误:
如何解决上述问题?
types - 所有 trait 对象的默认 trait 方法实现
我有一个 trait MyTrait
,我希望所有的 trait 对象&MyTrait
都可以相互比较,而不是其他任何东西。我现在基于如何测试特征对象之间的相等性?.
问题是我需要在MyTraitComparable
任何地方使用,而不是MyTrait
. 有没有办法解决这个问题?
我尝试移动as_any
并equals
提供MyTrait
默认实现,但是
- 我认为我不能
self
在那种情况下使用,所以它不起作用。 - 如果我使用
trait MyTrait: PartialEq
,那么我将无法再创建特征对象。
rust - 无法克隆 Vec> 因为 Trait 不能成为对象
我正在尝试克隆盒装特征的向量。自然,简单地推导Clone
实现我的特征的所有结构是不够的,因为编译器在编译时并不知道所有实现该特征的结构都具有Clone
.
好的,然后我尝试将Clone
其用作超特征,但这只会导致标题错误。我不知所措。
这是最小工作实现(或不工作,因为我无法克隆)
出现此错误:
这里是操场的链接,便于代码运行。
我也尝试在a中制作elements
矢量,但这也不起作用。Sequence
Vec<Box<MusicElement + Clone>>
我无法在网上找到任何有用的解决方案,所以这是我的问题:如何使代码可克隆?
rust - 如何使用具有关联类型的非静态特征对象?
我有这种类型:
我想实现std::ops::Index
并返回对特征对象的引用。这是我的第一次尝试(游乐场):
这不起作用并导致此错误:
我想我知道为什么会发生这种情况:type Output = Display
相当于type Output = Display + 'static
每个 trait 对象都有一个默认为'static
.
所以现在我可以将'static
绑定添加到我的参数T
,但我认为这是过度约束。当不使用关联类型时,我可以轻松实现这样的方法:
不需要'static
限制,因为现在签名去糖:
这是有道理的:特征对象必须至少存在'a
. (带有所有代码的游乐场)。
但是我可以使用关联类型(如Index
特征)来完成这项工作吗?我觉得这可能适用于泛型关联类型,但是(a)我不确定并且(b)它们还没有实现。
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?如果是,如何?
rust - 如何将值移出对象安全的特征对象?
AMech
携带一个驱动程序,它是一个Named
实体。在运行时,省略的Mech
构造函数会咨询外部源以获取要使用的特定类型的驱动程序。
方法driver_name
将所有权返回给 a String
,以便在链式调用中进一步使用它(在实际代码中它是 a Command
)。它编译失败:
使特征Sized
无法实现对象安全:
↓</p>
有没有办法让这种模式发生?
我似乎缺少什么基本的东西吗?
如果这是不可能实现的,有什么好的方法可以解决它?
rust - 如何从另一个 trait 对象创建一个 trait 对象?
Rust 的最新稳定版本(1.27)允许为特征对象(dyn Trait
)实现特征,所以我尝试了以下方法:
上面的代码导致错误:
这是令人困惑的,因为&T1
它是一个实例,dyn T1
所以有一个T2
实现。f2
我们甚至可以通过我们可以直接调用的事实来见证这一点t12
,因为删除最后两main
行使其可以编译。
是否可以从标记为不同特征的特征对象创建特征对象?