{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreib6nzqoxlffucm2c4lwzko3iwzyrmmr22lr2km7z6a2ecs5efov3m",
    "uri": "at://did:plc:ivbknywyskln22er3nkssdhl/app.bsky.feed.post/3mhfhaxqbz232"
  },
  "path": "/t/stable-type-identifiers-a-missing-piece-for-crabi-and-export/24093#post_16",
  "publishedAt": "2026-03-18T18:20:18.000Z",
  "site": "https://internals.rust-lang.org",
  "tags": [
    "this closed tracking issue",
    "also has hashing concerns,"
  ],
  "textContent": "ParaDevOne:\n\n> Lifetimes, Higher-Ranked Type Constraints, and Dyn Types. Up until now, I wasn't aware of the numerous limitations concerning the TypeId. If TypeId has the same restrictions in this proposal, that is a substantial limitation. Would it be possible for you to supply me with some information so that I can gain an understanding of what allows and/or limits me with respect to these restrictions?\n\nFor higher ranked types, you need a way to distinguish between e.g.\n\n\n    fn(&str) // aka for<'a> fn(&'a str)\n    fn(&'static str)\n\n\nIn addition to `fn` pointers, `dyn` types can also be higher-ranked (`dyn for<'a> Trait<'a>`).\n\nFor `dyn Trait` types, you need to decide what their \"path\" or other unique identifier is (based on the trait, presumably). Then you need to account for every possible `dyn Trait + Send`, `+ Sync`, `+ Send + Sync` combination somehow. Another detail is that associated types with `Sized` bounds may or may not be specified.\n\n`TypeId` does handle the above issues, but it's limited to types which meet a `'static` bound. Perhaps this closed tracking issue is a good place to start learning about that limitation. (`TypeId` also has hashing concerns, but AFAIU they are solvable via changing implementation details.)\n\n* * *\n\nAll that being said, I personally suspect \"it's now a breaking change to move your struct and trait declarations around\" is a blocker for the path based concept.",
  "title": "Stable type identifiers: a missing piece for crABI and export"
}