Rust中类似数组的类型“ Impl需要基本类型”

时间:2019-10-12 01:08:25

标签: rust

我将类型定义为大小固定的数组,并尝试为其实现一些自定义方法。

type Vec3 = [f64; 3];

impl Vec3 {
    fn display(&self) {
        println!("x = {}, y = {}, z = {}", self[0], self[1], self[2]);
    }
}

我收到此错误:

error[E0118]: no base type found for inherent implementation
 --> src/main.rs:7:6
  |
7 | impl Vec3 {
  |      ^^^^ impl requires a base type
  |
  = note: either implement a trait on it or create a newtype to wrap it instead

error: aborting due to previous error

此错误的本质是什么,我该如何修复我的代码?

1 个答案:

答案 0 :(得分:2)

您的专线

type Vec3 = [f64; 3];

并没有真正声明一个新类型,它只是为数组Vec3声明了一个名为[f64; 3]的{​​{3}}。

当我们运行rustc --explain E0118时,Rust编译器会帮助我们对其进行描述:

You're trying to write an inherent implementation for something which isn't a
struct nor an enum.

因此,您只能将impl用于structenum。您的情况的快速解决方案是将Vec3声明为type alias

struct Vec3([f64; 3]);

但是那意味着要重写您的display方法。为了清楚起见,我们将分解为局部变量:

    let Self(vec) = self;
    println!("x = {}, y = {}, z = {}", vec[0], vec[1], vec[2]);

您可以在tuple Struct上看到一个有效的示例。