当前位置: 首页 > 知识库问答 >
问题:

为什么Rust的运算符有类型输出变量?[副本]

厍华清
2023-03-14

我一直在网上读锈书,我已经达到4.1,操作员和过载。我注意到std::ops::add将其定义为fn add(self,RHS:RHS)->self::output;,并在特征中单独定义了类型output

我理解了这里的情况:add函数将左侧接受为self,将右侧接受为泛型参数类型rhs

我想知道为什么输出类型是用output别名定义的,而不是另一个泛型(例如add )?这只是一个惯例,还是有一个特定的原因?

共有1个答案

沈琛
2023-03-14

当函数对变量进行操作时,您可以将traits视为对类型进行操作的函数。如果这样考虑,类型参数将作为函数的输入,而关联的类型将作为输出。

由于output是一个关联的类型,因此对于我们希望IMPL ADD的两个类型aB,我们只能选择一个output类型。如果output是一个类型参数,我们可以通过多种方式为aB添加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,我也会遇到这个编译错误。