- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试编写一个特性,它需要一个类型来实现 Add
(以及进一步向下行的向量空间的其他操作)及其引用。下面是一个小例子,说明我遇到的问题:
use std::ops::Add;
#[derive(Debug)]
struct MyVec<T>(Vec<T>);
impl<'a, 'b, T: Copy + Add> Add<&'a MyVec<T>> for &'b MyVec<T> {
type Output = MyVec<T::Output>;
fn add(self, other: &'a MyVec<T>) -> Self::Output {
/* ... */
}
}
impl<'a, T: Copy + Add> Add<MyVec<T>> for &'a MyVec<T> {
/* ... */
}
impl<'a, T: Copy + Add> Add<&'a MyVec<T>> for MyVec<T> {
/* ... */
}
impl<T: Copy + Add> Add<MyVec<T>> for MyVec<T> {
/* ... */
}
trait Addable: Add<Self, Output = Self>
where
Self: Sized,
for<'a> &'a Self: Add<Self, Output = Self>,
for<'b> Self: Add<&'b Self, Output = Self>,
for<'a, 'b> &'a Self: Add<&'b Self, Output = Self>,
{
}
impl<T: Copy + Add<Output = T>> Addable for MyVec<T> {}
fn add_stuff<'a, 'b, T: Addable>(x: &'a T, y: &'b T) -> T {
x + y
}
fn main() {
let v = MyVec(vec![1, 2, 3]);
let w = MyVec(vec![2, 4, 6]);
println!("{:?}", add_stuff(&v, &w));
}
newtype
模式创建 Vec
的别名,这样我就可以在外部结构上实现外部特征 (Add
) ( Vec
).MyVec
及其引用实现了 Add
。关联类型 Output
始终是(未引用的)MyVec
。后三个 impl
是根据第一个实现的。Addable
是我要演示的核心特征。可添加的事物应该允许添加它们自己和它们的引用,结果是 Self
。特别是,在 add_stuff
中,我希望表达式 x + y + x
有效,其中 x + y
给出了一个可以添加的非引用用 x
(它没有被移出,因为它是一个 ref)产生另一个非 ref。MyVec
上Addable
特性实现的任何投诉。具体来说,编译器似乎认识到上述 impl
满足 where
子句中的界限。但是,我得到以下编译器错误:
error[E0277]: the trait bound `for<'a> &'a T: std::ops::Add<T>` is not satisfied
--> src/main.rs:33:1
|
33 | / fn add_stuff<'a, 'b, T: Addable>(x: &'a T, y: &'b T) -> T {
34 | | x + y
35 | | }
| |_^ no implementation for `&'a T + T`
|
= help: the trait `for<'a> std::ops::Add<T>` is not implemented for `&'a T`
= help: consider adding a `where for<'a> &'a T: std::ops::Add<T>` bound
= note: required by `Addable`
error[E0277]: the trait bound `for<'a, 'b> &'a T: std::ops::Add<&'b T>` is not satisfied
--> src/main.rs:33:1
|
33 | / fn add_stuff<'a, 'b, T: Addable>(x: &'a T, y: &'b T) -> T {
34 | | x + y
35 | | }
| |_^ no implementation for `&'a T + &'b T`
|
= help: the trait `for<'a, 'b> std::ops::Add<&'b T>` is not implemented for `&'a T`
= help: consider adding a `where for<'a, 'b> &'a T: std::ops::Add<&'b T>` bound
= note: required by `Addable`
这可以通过使用编译器建议的 where
子句修改 add_stuff
函数来解决:
where
for<'c, 'd> &'c T: Add<&'d T, Output = T>,
for<'c> &'c T: Add<T, Output = T>,
我不明白为什么这是必要的。我想通过在特性的定义中指定一个界限,我可以依赖于实现该特性的任何类型都满足该界限吗?每次都必须添加这些 where
子句有点违背我的 Addable
特征的全部要点。
谷歌搜索显示 this GitHub issue我不完全理解,但可能相关?这表明这确实是 Rust 中的一个错误(很长一段时间都没有修复)。
最佳答案
您遇到了 Rust 编译器目前的缺点。 RFC 2089提出让它按你期望的方式工作,并于 2017 年 12 月被接受。
但是,到今天为止,该功能尚未实现。 tracking issue for the implementation还没有看到太多事件,所以看起来实现甚至还没有开始。在有效实现此特定功能之前,似乎有必要对编译器的特征绑定(bind)处理进行一些基本改进(搜索关键字:chalk)。
关于rust - 为什么有必要添加冗余特征边界,即使我的特征使用那些相同的特征作为边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49434716/
我正在使用 this solution在二进制矩阵中找到与图像边界对齐的矩形。假设现在我想找到一个不与图像边框对齐的矩形,并且我不知道它的方向;找到它的最快方法是什么? 为了示例,让我们寻找一个仅包含
else: 行在这个 Python 程序中是否正确/必要? from random import randrange for n in range(10): r = randrange(0,1
在 TDPL 7.1.5.1 中讨论了将 Widget w2 分配给 w1 并且作者指出“将 w2 逐个字段分配给 w1 会将 w2.array 分配给 w1.array——一个简单的数组边界分配,而
我是一名优秀的程序员,十分优秀!