2015-06-04 14 views
6

Để viết thêm một lint khác trong Rust, tôi cần đảm bảo rằng loại Expr thực sự là Option<_> (hoặc bất kỳ con trỏ nào đến một). Tôi đã đi bất kỳ ptr s và rptr s đến kết luận của họ và đang trái với một rustc::middle::ty rằng trong trường hợp thử nghiệm của tôi debugs đến (bằng tay được định dạng để có thể đọc tốt hơn):Cách tìm hiểu loại rustc :: middle :: ty :: Ty đại diện cho cái gì?

TyS { 
    sty: ty_enum(
    DefId { 
     krate: 2, 
     node: 117199 
    }, 
    Substs { 
     types: VecPerParamSpace { 
     TypeSpace: [ 
      TyS { 
      sty: ty_int(i32), 
      flags: 0, 
      region_depth: 0 
      } 
     ], 
     SelfSpace: [], 
     FnSpace: [], 
     }, 
     regions: NonerasedRegions(
     VecPerParamSpace { 
      TypeSpace: [], 
      SelfSpace: [], 
      FnSpace: [], 
     } 
    ) 
    } 
), 
    flags: 0, 
    region_depth: 0 
} 

Tuy nhiên, bây giờ tôi đang một chút mất - làm cách nào để tìm hiểu xem TYS có thực sự là tùy chọn < _> không?

Trả lời

2

Bạn cần sử dụng with_path trên DefId. Bạn sẽ được cung cấp một trình lặp trên PathElem mà bạn phải tiêu thụ.

Sau đây là bản phác thảo thô, nhưng phải cung cấp cho bạn một mảng Name giây nếu bạn tinh chỉnh nó một chút.

if let ty_enum(did, ..) = ty.sty { 
    tcx.with_path(did, |iter| iter.map(|elem| elem.name())).collect::<Vec<Name>>; 
} 
+0

Làm mát. Tôi thậm chí còn có thể '.zip'' iter' của 'Name' với một slice '& str' và so sánh chúng mà không cần xây dựng một Vec trước. – llogiq

Các vấn đề liên quan