Function core::intrinsics::mir::Field

source ·
pub fn Field<F>(place: (), field: u32) -> F
🔬This is a nightly-only experimental API. (custom_mir)
Expand description

访问具有某个地方的给定索引的字段。

这只有与 Variant 结合使用才有意义。 如果您要访问的字段的类型没有变体,您可以使用普通字段投影语法。

在 Rust 中没有对变体进行位置投影的正确方法,因此这两个函数是一种解决方法。 您可以通过 Field(Variant(place, var_idx), field_idx) 访问变体的字段,其中 var_idxfield_idx 是合适的字面量。 一些警告:

  • Variant 的返回类型始终为 ()。不用担心,仍然会生成正确的 MIR。
  • 在某些情况下,无法推断 Field 的返回类型。在这些情况下,您可能需要在函数上注解。
  • 由于 Field 是一个函数调用,它不是一个位置表达式,因此在表达式的左侧使用它会被编译器拒绝。

place! 是为解决该问题而提供的宏。 将赋值的左侧包裹在宏中,以说服编译器它没问题。

Examples

#![feature(custom_mir, core_intrinsics)]

use core::intrinsics::mir::*;

#[custom_mir(dialect = "built")]
fn unwrap_deref(opt: Option<&i32>) -> i32 {
    mir!({
        RET = *Field::<&i32>(Variant(opt, 1), 0);
        Return()
    })
}

#[custom_mir(dialect = "built")]
fn set(opt: &mut Option<i32>) {
    mir!({
        place!(Field(Variant(*opt, 1), 0)) = 5;
        Return()
    })
}
Run