2015-06-04 2 views
6

Для написания еще одного ворса в Rust мне нужно убедиться, что тип Expr на самом деле является Option<_> (или любым указателем на один). Я уже ходил любые ptr с и rptr с до их завершения, и я остался с rustc::middle::ty, что в моем тесте случае отлаживает, чтобы (вручную отформатированы для лучшей читаемости):Как узнать, какой тип rustc :: middle :: ty :: Ty представляет?

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 
} 

Однако, теперь я немного потерял - как узнать, действительно ли TyS является опцией < _> типа?

ответ

2

Вам необходимо использовать with_path на DefId. Вам будет предоставлен итератор за PathElem, который вы должны использовать.

Ниже приведен примерный эскиз, но он должен дать вам массив Name с, если вы немного его настроите.

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

Прохладный. Я даже смог «.zip» 'iter'' Name's с фрагментом '& str' и сравнить их, не создавая сначала Vec. – llogiq