That's a really good question. In my specific case, I need the exact same type. But a "proper" implementation would presumably be able to provide "any matching type" (I believe the Haskell implementation does this).
On Fri, Aug 23, 2013 at 7:17 PM, Matthieu Monrocq < [email protected]> wrote: > One question: > > Do you only want to retrieve the exact type that was passed in, or would > you want to be able to extract an impl that matches the type actually > contained ? > > The latter is more difficult to implement (dynamic_cast goes through hoops > to check those things), but it is doable if sufficient information is > encoded in the v-table. > > > On Fri, Aug 23, 2013 at 5:04 PM, Oren Ben-Kiki <[email protected]> wrote: > >> Yes, this would be similar to the `Typeable` type class in Haskell. It >> queries the vtable-equivalent, which contains stuff like the name of the >> type and allows doing `typeof(x)`, dynamic casts, etc. This is heavily >> magical (that is, depends on the hidden internal representation) and >> properly belongs in the standard platform and not in a user-level library. >> >> >> On Fri, Aug 23, 2013 at 4:40 PM, Niko Matsakis <[email protected]> wrote: >> >>> Currently, this is not directly supported, though downcasting in >>> general is something we have contemplated as a feature. It might be >>> possible to create some kind of horrible hack based on objects. A >>> trait like: >>> >>> trait Dynamic { } >>> impl<T> Dynamic for T { } >>> >>> would allow any value to be cast to an object. The type descriptor can >>> then be extracted from the vtable of the object using some rather >>> fragile unsafe code that will doubtless break when we change the >>> vtable format. The real question is what you can do with the type >>> descriptor; they are not canonicalized, after all. Still, it's >>> ... very close. This is basically how dynamic downcasting would work, >>> in any case. >>> >>> >>> Niko >>> >>> On Fri, Aug 23, 2013 at 07:49:57AM +0300, Oren Ben-Kiki wrote: >>> > Is it possible to implement something like Haskell's Dynamic value >>> holder >>> > in Rust? (This would be similar to supporting C++'s dynamic_cast). >>> > Basically, something like this: >>> > >>> > pub struct Dynamic { ... } >>> > impl Dynamic { >>> > pub fn put(value: ~T) { ... } >>> > pub fn get() -> Option<T> { ... } >>> > } >>> > >>> > I guess this would require unsafe code... even so, it seems to me that >>> Rust >>> > pointers don't carry sufficient meta-data for the above to work. A >>> possible >>> > workaround would be something like: >>> > >>> > pub struct Dynamic { type_name: ~str, ... } >>> > impl Dynamic { >>> > pub fn put(type_name: &str, value: ~T) { Dynamic { type_name: >>> > type_name, ... } } >>> > pub fn get(&'a self, type_name: &str) -> Option<&'a T> { >>> > assert_eq!(type_name, self.type_name); ... } } >>> > } >>> > >>> > And placing the burden on the caller to always use the type name "int" >>> when >>> > putting or getting `int` values, etc. This would still require some >>> sort of >>> > unsafe code to cast the `~T` pointer into something and back, while >>> > ensuring that the storage for the `T` (whatever its size is) is not >>> > released until the `Dynamic` itself is. >>> > >>> > (Why do I need such a monstrosity? Well, I need it to define a >>> > `Configuration` container, which holds key/value pairs where whoever >>> sets a >>> > value knows its type, whoever gets the value should ask for the same >>> type, >>> > and the configuration can hold values of "any" type - not from a >>> predefined >>> > list of types). >>> > >>> > Is such a thing possible, and if so, how? >>> > >>> > Thanks, >>> > >>> > Oren Ben-Kiki >>> >>> > _______________________________________________ >>> > Rust-dev mailing list >>> > [email protected] >>> > https://mail.mozilla.org/listinfo/rust-dev >>> >>> >> >> _______________________________________________ >> Rust-dev mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/rust-dev >> >> >
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
