Bài viết phổ biến của tác giả
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个通用的结构,具有通用实现特征的界限。特征本身是通用的。这是在 Rust 1.49.0 中。
如果我这样做:
trait Foo {}
struct Baz> {
x: F,
}
我得到一个编译错误,因为 T
没有定义。但是如果我定义它:
trait Foo {}
struct Baz> {
x: F,
}
然后我得到一个编译器错误,因为 T
未使用。
唯一的选择似乎是包含一个 PhantomData
领域,但如果我的通用依赖变得更加复杂,这将开始变得更加笨拙:
use std::marker::PhantomData;
trait Foo {}
struct Baz, G: Foo> {
phantom_t: PhantomData,
phantom_u: PhantomData,
x: F,
y: G,
}
我一半的领域是幻影!该结构实际上闹鬼了。
我的问题是:最后编译的示例真的是惯用的 Rust 吗?如果是这样,为什么 Rust 不能检测到 T
hiện hữuBaz
实际使用了吗?
1 Câu trả lời
Is the example at the end that compiles really idiomatic Rust?
存储多个幻像类型参数的惯用方法是使用元组:
struct Baz, G: Foo> {
x: F,
y: G,
_t: PhantomData<(T, U)>,
}
why can Rust not detect that the
T
TRONGBaz
is actually used?>
这实际上是由于 variance 而导致的预期行为和 drop check .这里的想法是,编译器需要知道它可以对类型参数 T
施加哪些约束。 ,以及 PhantomData
的用法type 将指示编译器如何执行此操作。
您可以了解更多关于 PhantomData
的信息以及它如何影响 Rust nomicon 中的方差.
关于generics - 依赖于 Rust 中另一个泛型的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65960825/
Tôi là một lập trình viên xuất sắc, rất giỏi!