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_idx
和 field_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