问题标签 [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 - 返回闭包的函数在我的过滤器中不起作用
如果不使用闭包,我无法编译它。我试图让函数apply
首先返回正确类型的闭包。
我该怎么做才能让apply
工作如我所愿?
rust - 有没有办法确定 VTable 中每个特征方法的偏移量?
我想我可以或多或少地尝试从头开始构建一个特征对象而不使用这些impl
块。详细说明:
据我了解,成员函数出现在特征定义中的顺序并不总是与函数指针出现在 VTable 中的顺序相同。有没有办法确定 VTable 中每个特征方法的偏移量?
generics - 通过特征而不是结构参数化的变量?
我正试图围绕 Rust 的泛型。我正在写一些东西来从不同的网站中提取 HTML。我想要的是这样的:
我收到关于通过两种不同类型参数化的match
返回s 的错误。Spider
它期望它返回Spider<GoogleParser>
,因为这是模式匹配的第一臂的返回类型。
我怎么能声明spider
应该是 any Spider<T: CanGetTitle>
?
rust - RC到选项?
我正在尝试实现一个看起来像这样的方法:
但是,try_unwrap
不适用于特征对象(这是有道理的,因为它们没有大小)。我的下一个想法是尝试找到一些Rc<Any>
直接展开的函数Box<Any>
。我能找到的最接近的东西是
但是,Rc::into_raw()
似乎要求 to 中包含的类型Rc
是Sized
,理想情况下我不想使用unsafe
块。
有什么方法可以实现吗?
Playground Link,我正在寻找rc_to_box
这里的实现。
rust - 匹配返回迭代器的臂?
我有一些代码尝试运行匹配,其中每个分支都可以返回不同的类型,但所有这些类型都实现了Iterator<Item=usize>
.
...在哪里MatchingAs
,,MatchingBs
和MatchingCs
所有impl
std::iter::Iterator<Item = usize>
。
我正在碰壁,因为Iterator
它没有尺寸:
有没有一种好的方法让匹配臂返回具有共享特征的对象,然后(仅)依赖于该特征来处理结果?
rust - 了解特征和对象安全
我正在努力解决对象安全的基础知识。如果我有这个代码
我收到
当我添加或删除: Sized
作为超特征或作为f
绑定时,我收到略有不同的错误消息。
有人可以解释一下:
为什么这个特定的例子不起作用?特征对象一章指出:
那么是什么让方法对象安全呢?每种方法都必须要求
Self: Sized
这不是实现了吗?
Trait: Sized
和 和有什么不一样where Self: Sized
?(嗯,是的,一个继承了 trait,另一个是参数绑定,但是从 Rust 的 trait 对象的角度来看?我必须做出的首选
object_safety_dynamic
改变是什么?
rustc 1.19.0-nightly (01951a61a 2017-05-20)
如果重要,我正在使用。
解决关于固定尺寸的评论。
generics - 特质不能变成对象
我有以下代码:
当我尝试编译它时,我收到错误消息:
我想我知道它为什么会发生,但是我如何从结构中引用特征呢?可能吗?也许还有其他方法可以实现相同的行为?
generics - 是否可以自动实现将特征对象转换为另一个特征对象的特征?
我有一个特征可以管理到不同特征对象的转换。特征看起来像这样:(Boo
并且Gee
都是不同的特征)
为了减少样板代码的数量,我现在想自动将此实现更改为此,以防结构实现Boo
/ Gee
:
如果只有一个其他特征我必须使用泛型转换为,我可以这样做:
但是,如果我也想自动实现Foo
它Gee
,因为我无法实现Foo
两次,因此它不能以这种方式工作,据我所知,Rust 不支持这种方式。
使用它也许可以实现这一点,Procedural Macros
但我找不到对它们的任何深入解释,所以我现在有点卡住了。
rust - Rust 中的 trait 对象是如何实现的?
我试图了解特征对象是如何在 Rust 中实现的。请让我知道以下理解是否正确。
我有一个函数可以采用任何实现Write
特征的类型:
在我们有实现此特征并调用上述函数的类型的任何地方,编译器都会生成一个“特征对象”,可能是通过添加对TraitObject::new(data, vtable)
.
如果我们有类似的东西:
可能会变成:
编译器内部some_func
将仅访问基于TraitObject
传递的 vtable 使用的方法。