【问题标题】:In Rust, why is '[T]' and 'str' slice type not a syntax error?在 Rust 中,为什么 '[T]' 和 'str' 切片类型不是语法错误?
【发布时间】:2021-07-11 12:13:51
【问题描述】:

据我了解,&[T] 类型是一个“胖”指针(内存地址和大小),而不是切片本身,[T] 是被引用的实际切片。但是他们为什么不在下面的上下文中将[T] 设为语法错误呢?

let y: [i32; 6] = [1, 2, 3, 4, 5, 6];

// let z: [i32] = y[..]; // error: the size for values of type `[i32]` cannot be known at compilation time

let z: &[i32] = &y[..]; // OK

// let v: str = "Hello World"; // the size for values of type `str` cannot be known at compilation time

从错误:[i32] cannot be known at compilation,这只是一个错误,让我,用户,理解为什么这种语法是不可能的,还是因为我没有正确使用这种语法,它在某些情况下是有效的?

编辑:修正错字

【问题讨论】:

  • z 的类型应该是什么?
  • 抱歉,我打错了一些代码,已修复。 x 应该是 y。注释掉的z 应该是[i32]
  • @DenysSéguret 严格来说 [T] 实际上是一个实际的切片类型,尽管通俗地说 &[T] 也称为切片:doc.rust-lang.org/reference/types/slice.html
  • 你为什么要准确地要求 syntax 错误?仅仅因为某些东西没有语义意义并不意味着它是无效的语法。
  • feature(unsized_locals) 最终可能使这个语法有效的代码也语义有效。

标签: arrays string rust slice


【解决方案1】:

因为在某些情况下可以使用str[T]dyn MyTrait 等未调整大小的类型。

目前最常见的是泛型。例如,您可以使用 Box<[T]>Box<str>Arc<[T]> 或任何带有 ?Sized 绑定的泛型。

还有一些正在开发中的功能使用这种未调整大小的类型:

【讨论】:

    【解决方案2】:

    但他们为什么不在下面的上下文中将 [T] 设为语法错误?

    因为语法没有任何理由无效?

    虽然 DST 难以使用并且在任何地方都没有意义,但在某些情况下它们是完全合法的,例如

    struct Foo {
        a: usize,
        b: [i32]
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 2017-05-01
      • 2023-01-15
      • 2020-12-27
      • 1970-01-01
      • 2017-05-27
      • 2020-08-26
      • 1970-01-01
      相关资源
      最近更新 更多