我一直在网上读锈书,我已经达到4.1,操作员和过载。我注意到std::ops::add
将其定义为fn add(self,RHS:RHS)->self::output;
,并在特征中单独定义了类型output
。
我理解了这里的情况:add
函数将左侧接受为self
,将右侧接受为泛型参数类型rhs
。
我想知道为什么输出类型是用output
别名定义的,而不是另一个泛型(例如add
)?这只是一个惯例,还是有一个特定的原因?
当函数对变量进行操作时,您可以将traits视为对类型进行操作的函数。如果这样考虑,类型参数将作为函数的输入,而关联的类型将作为输出。
由于output
是一个关联的类型,因此对于我们希望IMPL ADD
的两个类型a
和B
,我们只能选择一个output
类型。如果output
是一个类型参数,我们可以通过多种方式为a
和B
添加IMPLADD
。
例如,让我们定义一个mul
特征,其中output
是一个参数:
trait Mul<RHS, Output> {
fn mul(self, rhs: RHS) -> Output;
}
现在让我们定义一个complex
类型:
#[derive(Debug, Clone, Copy)]
struct Complex {
x: f64,
y: f64,
}
impl Complex {
fn new(x: f64, y: f64) -> Complex {
Complex { x: x, y: y }
}
}
我们希望能够将其乘以f64
:
impl Mul<f64, Complex> for Complex {
fn mul(self, rhs: f64) -> Complex {
Complex::new(self.x * rhs, self.y * rhs)
}
}
一切正常。然而,我们可以提出第二种实现方式:
impl Mul<f64, f64> for Complex {
fn mul(self, rhs: f64) -> f64 {
self.x * rhs
}
}
impl std::ops::Mul<f64> for Complex {
type Output = Complex;
fn mul(self, rhs: f64) -> Complex {
Complex::new(self.x * rhs, self.y * rhs)
}
}
impl std::ops::Mul<f64> for Complex {
type Output = f64;
fn mul(self, rhs: f64) -> Complex {
self.x * rhs
}
}
编辑:接受的答案声明Haskell支持这一点,
问题内容: 下列类定义了两种方法,它们在直观上都具有相同的功能。每个函数都有两个类型和一个布尔值的列表来调用,该值指定应将这些列表中的哪个分配给局部变量。 根据,有效而无效。它抱怨: 我知道查找包含三元运算符()的表达式类型的规则非常复杂,但是据我了解,它选择了最具体的类型,第二个和第三个参数都可以转换为该类型,而无需显式投。在这里,应该是,但不是。 我想解释一下为什么不是这种情况,最好参考 Ja
所以我有这个代码: 它应该打开一个文本为"true"的消息对话框。问题是它会给出一个编译器错误,说我不能调用基元类型int的方法。为什么会发生这种情况? 铸造按预期工作。我只是不明白为什么对象会变成一个基本类型。
问题内容: 我读到从Java 7开始,像在第一条语句中那样在右侧指定类型来创建Collections是不好的样式,因为编译器可以从左侧推断类型。 我的问题是,当像这样初始化列表时,编译器找不到类型,并且我收到未经检查的类型警告: 问题答案: 编译器不会 推断 类型,因为您正在实例化 raw 。但是它足够聪明,可以警告您在使用此(原始)对象时可能会出现问题。 值得一提的是此警告背后的原因。由于类型擦
本文向大家介绍C ++中的变量和变量类型是什么?,包括了C ++中的变量和变量类型是什么?的使用技巧和注意事项,需要的朋友参考一下 变量为我们提供了程序可以操纵的命名存储。C ++中的每个变量都有一个特定的类型,该类型确定变量的内存大小和布局。可以存储在该内存中的值的范围;以及可以应用于该变量的一组操作。一个非常简单的变量示例是- 在这里,我们有一个变量my_val,类型为int(integer)
作为学习Rust的一个简单练习,我决定实现一个简单的二进制搜索: 在构建时,我得到了这个我不理解的错误。什么是类型?变量mid始终是usize,但即使使用cast,我也会遇到这个编译错误。