gpt4 book ai didi

rust - 我是否必须 'use' 一个特征才能调用该特征中定义的方法?

转载 作者:行者123 更新时间:2023-11-29 07:56:47 25 4
gpt4 key购买 nike

我在玩弄 cgmath图书馆。我有以下 main.rs 文件:

extern crate cgmath;

use cgmath::vector::{Vector3, EuclideanVector};

fn main() {
let mypoint = Vector3 { x: 1f64, y: 1f64, z: 3f64 };

println!("The length of the vector is {}, and the length squared is {}", mypoint.length(), mypoint.length2());
}

在我的使用行中,当我省略 EuclideanVector 时,出现以下编译错误:

type 'cgmath::vector::Vector3<f64>' does not implement any method in scope named 'length'

Rust 编译器似乎无法找到 length() 方法,除非我导入 Vector3 使用的特征之一。深入研究 source code , 看起来 length 方法是在 EuclideanVector 特性中定义的。

直觉上,我不需要导入特征来使用继承所述特征的类型。有没有一种技术可以让我失踪?这是 cgmath 库特有的细微差别吗?这是我应该习惯的 Rust 惯用部分吗?

最佳答案

您正在考虑继承方面的特征。如果您将特征视为相对于 Self 类型可重载的模块,则可能更有意义。从这个角度来看,特征必须在范围内才能让编译器知道它的方法,就像模块必须在范围内才能使用它一样。这一点的一个特殊含义是实现可以与它们实现的特征一起声明,而不是它们实现它的类型。在这种情况下,很明显,如果您的代码不知道该特征,它就无法使用其方法。

当前行为的另一个动机是多个 traits 可以定义同名方法,当为相同类型实现的 traits 发生这种冲突时,您不能再使用方法调用语法来访问它们的方法。相反,您必须使用函数调用语法来指定该方法是哪个特征的成员(该特征充当该方法所在的模块)。如果方法调用语法使用程序中的所有特征,而不仅仅是方法解析范围内的特征,那么您最终会更频繁地遇到这些冲突,因为您的代码与特征中的方法有名称冲突,而您的代码不是实际上直接使用。

关于rust - 我是否必须 'use' 一个特征才能调用该特征中定义的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com