深度理解之二:typeck_results.expr_ty_adjusted(arg);

·

5 min read

能解释下这个typeck_results是干嘛的,为什么一定要转换成 let adjusted_type = typeck_results.expr_ty_adjusted(arg);才好用

这段代码涉及到 Rust 的内部编译器的数据结构和API。简单来说,typeck_results 是 Rust 编译器中 TypeckTables 的一个实例,它存储了 Rust 的类型检查阶段得到的各种信息。

为了帮助理解,我们可以逐一地分析这些内容:

  1. TypeckResults:这是 Rust 编译器在类型检查阶段为给定的 HIR (High-level Intermediate Representation) 所得到的信息的集合。

  2. hir_owner:这是正在被类型检查的 HIR 节点的标识符。例如,这可能是一个函数或模块。

  3. type_dependent_defs、field_indices、node_types 等:这些是与 HIR 节点相关的各种信息的映射。例如,node_types 映射了 HIR 节点到它们的类型。

  4. expr_ty_adjusted(arg):这个函数从上面的 node_types 映射中获取 arg 表达式的类型。"adjusted" 的意思是,它返回调整后的类型,这考虑到了诸如自动引用、解引用等的调整。

为什么需要 "adjusted" 呢?在 Rust 中,编译器有时会自动进行一些调整,例如自动引用和解引用。当你写 &*some_pointer 时,这是一个解引用后又进行引用的操作,但这在大多数情况下等同于直接写 some_pointer。因此,编译器可能会自动为你做这样的调整。为了获取表达式的 "真实" 类型,你可能需要查询它的 "调整后" 的类型。

在给定的代码片段中,开发者似乎想要确定当一个指针被解引用时,该指针是否是一个 "unsafe pointer"。这就是为什么他们检查 is_unsafe_ptr() 并将结果打印出来的原因。

🌲 typeck_results: TypeckResults { 
hir_owner: DefId(0:18 ~ c2rust_lib[8787]::blocksort::fallbackSimpleSort),
 type_dependent_defs: {182: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 
387: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 
138: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 
100: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 
148: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 
289: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 
187: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 
382: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 344: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 306: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 354: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 414: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 214: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset))), 83: Ok((AssocFn, DefId(2:1584 ~ core[5bc6]::ptr::mut_ptr::{impl#0}::offset)))}, field_indices: {}, node_types: {189: bool, 378: i32, 433: bool, 165: i32, 354: *mut u32, 31: u32, 220: u32, 409: i32, 275: bool, 330: *mut u32, 7: i32, 196: (), 306: *mut u32, 361: (), 38: (), 227: (), 148: *mut u32, 203: i32, 392: bool, 69: bool, 124: *mut u32, 313: i32, 179: isize, 368: bool, 45: bool, 234: bool, 100: *mut u32, 289: *mut u32, 155: i32, 344: *mut u32, 21: i32, 210: i32, 265: i32, 320: i32, 186: isize, 52: (), 241: (), 430: i32, 107: i32, 162: (), 351: isize, 28: u32, 217: i32, 83: *mut u32, 272: i32, 138: *mut u32, 4: i32, 193: bool, 382: *mut u32, 59: i32, 248: i32, 114: i32, 303: isize, 35: (), 224: i32, 413: isize, 145: isize, 334: i32, 11: i32, 200: *mut u32, 389: bool, 66: i32, 255: bool, 176: *mut u32, 365: i32, 420: u32, 97: isize, 286: isize, 341: isize, 18: i32, 396: (), 262: i32, 128: i32, 183: u32, 49: (), 238: (), 427: (), 293: i32, 348: *mut u32, 25: i32, 214: *mut u32, 403: i32, 80: isize, 135: isize, 324: bool, 1: *mut u32, 190: bool, 379: isize, 56: i32, 245: i32, 434: bool, 300: *mut u32, 355: u32, 221: (), 410: i32, 87: i32, 276: (), 142: *mut u32, 8: u32, 386: isize, 441: (), 118: bool, 307: u32, 173: *mut u32, 362: (), 39: (), 228: (), 417: i32, 94: *mut u32, 283: *mut u32, 149: u32, 15: i32, 204: i32, 393: bool, 70: (), 259: (), 314: i32, 46: bool, 235: bool, 424: i32, 101: u32, 290: u32, 345: u32, 211: isize, 400: *mut u32, 77: *mut u32, 266: i32, 321: i32, 187: *mut u32, 376: *mut u32, 53: (), 108: i32, 297: u32, 163: (), 218: u32, 84: u32, 273: (), 139: u32, 5: i32, 383: u32, 60: i32, 438: (), 115: i32, 170: u32, 359: i32, 225: i32, 414: *mut u32, 91: u32, 280: i32, 12: i32, 390: bool, 67: (), 256: bool, 311: i32, 43: i32, 232: i32, 421: (), 153: i32, 74: i32, 184: isize, 373: *mut u32, 239: (), 428: (), 105: i32, 294: (), 160: i32, 26: i32, 215: u32, 404: i32, 325: (), 2: *mut u32, 191: bool, 246: i32, 435: bool, 167: i32, 356: (), 33: bool, 411: isize, 88: (), 277: !, 332: i32, 9: *mut u32, 387: *mut u32, 253: i32, 442: (), 119: (), 308: (), 363: (), 418: u32, 150: (), 339: i32, 16: i32, 71: !, 126: i32, 315: i32, 181: isize, 370: u32, 47: bool, 236: bool, 425: i32, 102: (), 291: i32, 23: i32, 133: i32, 322: (), 188: u32, 243: i32, 432: i32, 109: i32, 353: isize, 30: u32, 85: i32, 6: i32, 195: (), 384: isize, 439: (), 116: (), 305: isize, 360: i32, 37: !, 226: (), 415: u32, 147: isize, 13: i32, 202: i32, 391: bool, 257: bool, 178: i32, 367: i32, 44: bool, 233: bool, 99: isize, 288: isize, 154: i32, 343: isize, 20: i32, 209: i32, 264: i32, 51: bool, 240: (), 161: (), 350: i32, 82: isize, 271: i32, 137: isize, 326: !, 3: i32, 192: bool, 381: isize, 58: i32, 247: i32, 436: bool, 302: i32, 168: bool, 34: (), 144: i32, 333: i32, 10: *mut u32, 388: u32, 65: i32, 254: bool, 120: !, 41: i32, 230: i32, 96: i32, 285: i32, 340: i32, 395: (), 127: i32, 182: *mut u32, 426: (), 213: isize, 402: i32, 79: i32, 134: i32}, node_substs: {182: [u32], 387: [u32], 138: [u32], 100: [u32], 148: [u32], 289: [u32], 187: [u32], 382: [u32], 344: [u32], 306: [u32], 354: [u32], 414: [u32], 214: [u32], 83: [u32]}, user_provided_types: {13: Canonical { max_universe: U0, variables: [], value: Ty(i32) }, 18: Canonical { max_universe: U0, variables: [], value: Ty(i32) }, 23: Canonical { max_universe: U0, variables: [], value: Ty(i32) }, 28: Canonical { max_universe: U0, variables: [], value: Ty(u32) }}, user_provided_sigs: {}, adjustments: {224: [], 253: [], 430: [], 43: [], 232: [], 37: [NeverToAny -> ()], 165: [], 424: [], 188: [], 153: [], 246: [], 432: [], 365: [], 170: [], 167: [], 71: [NeverToAny -> ()], 388: [], 359: [], 120: [NeverToAny -> ()], 277: [NeverToAny -> ()], 370: [], 367: [], 41: [], 230: [], 326: [NeverToAny -> ()]}, pat_binding_modes: {7: BindByValue(Mut), 4: BindByValue(Mut), 1: BindByValue(Mut), 8: BindByValue(Mut), 5: BindByValue(Mut), 2: BindByValue(Mut), 6: BindByValue(Mut), 3: BindByValue(Mut)}, pat_adjustments: {}, upvar_capture_map: {}, closure_kind_origins: {}, liberated_fn_sigs: {0: ([*mut u32, *mut u32, i32, i32]; c_variadic: false)->()}, fru_field_types: {}, coercion_casts: {333, 154, 247, 314, 59, 203, 127, 108, 265, 403}, used_trait_imports: {}, tainted_by_errors: None, concrete_opaque_types: {}, closure_captures: {}, generator_interior_types: [] } 🌲
🐋 Adjusted type: *mut u32 🐋