rust 为什么元组结构和枚举变量的行为类似于函数[closed]

6yt4nkrj  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(141)

昨天关门了。
Improve this question
它看起来像是关于绑定一个类型构造函数到一个变量,但是我没有看到在一个野生的和编译器接受它像它是正常的。这就是为什么我问。
先谢了!
link to playgroud

#[derive(Debug)]
struct B(u8);

#[derive(Debug)]
enum E {
    A(u8),
}

fn main() {
    let y = E::A;
    let y = y(0);
    dbg!(y);

    let x = B;
    let x = x(0);
    dbg!(x);

    // uncomment to see compiler complain
    // let c: fn(u8) -> u8 = B;
}
    • UPD:**刚刚回忆起让我好奇的东西。这是来自Rust 1.66.0 Announce的代码块,我也觉得很混乱。
#[repr(u8)]
enum Foo {
    A(u8),
    B(i8),
    C(bool) = 42,
}
2ul0zpep

2ul0zpep1#

对于元组结构体和枚举变量,为了方便起见,编译器会定义一个与结构体/变量同名的函数,这样可以很容易地将集合 Package 在结构体/变量中,如下所示:

let ints = vec![1u8, 2, 3, 4];
let bs = ints.iter().copied().map(B).collect::<Vec<_>>();
let as = ints.iter().copied().map(E::A).collect::<Vec<_>>();

它也可能是为了避免混淆,在这种情况下,某些标识符可以省略括号,而其他标识符则不能。

kt06eoxx

kt06eoxx2#

它们之所以这样是因为编译器就是这样设计的。
类似元组的结构体和类似元组的枚举变体都可以用作其各自功能项类型的零大小值。
而这些又可以被强制为函数指针,这就是当你赋值fn(_) -> _类型时c被声明的内容。
记录如下:The Rust Reference - Function item types .

相关问题