<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Aravinda (cc’ing rust-dev)-<div><br></div><div>It seems like you are trying to program in Rust as if it were a dynamically-typed language, or one with runtime-type reflection (i.e. like Java).  At least, that is my best guess at where your misunderstanding lies.</div><div><br></div><div>All functions in Rust, even generic ones, need to have their types resolved at compile-time.  A generic function can have different concrete types substituted in for its type parameters at different call-sites, but in the end, a particular call-site needs to resolve to a single type at compile-time; the type cannot be left for later resolution at program runtime.</div><div><br></div><div>In a signature like your:</div><div><br></div><div><div dir="ltr">    fn get_value(settings:HashMap<String, MyTypes>, key: &'static str) -> T;</div></div><div><br></div><div>the particular instance of `MyTypes` that is returned will depend on which `key` is passed in; therefore, the `T` above could only be dynamically determined based on the runtime computation.  It inherently cannot be resolved at compile-time, and therefore it is not statically typed.</div><div><br></div><div>----</div><div><br></div><div>Rust is not alone in offering this kind of generic types; many programming languages use a similar logic for determining types at compile time.  It just gets fuzzy if one is used to languages that maintain types at runtime and do not enforce restrictions like the one I outlined above.</div><div><br></div><div>These type systems are often said to offer “parametric polymorphism”; I mention that solely to give you some guidance for a term to search for when goggling this subject.  (Though I will say up front that a lot of the results you get on this topic can be very academic and language research-oriented.)</div><div><br></div><div>Here is a tutorial that may help you get a handle on the concepts here:</div><div><br></div><div>  <a href="http://lucacardelli.name/Papers/BasicTypechecking.pdf">http://lucacardelli.name/Papers/BasicTypechecking.pdf</a></div><div><br></div><div>(Yes, it is from 1987.  I think that is why it probably one of the better descriptions I was able to find quickly: At that time, these ideas were not as widely popularized as they were today, so Cardelli took his time explaining the notions and assumed little about the audience.)</div><div><br></div><div>rust-dev members: If others know of freely available introductions to this topic, I’m all ears; I just didn’t see any obvious winners in my searches.</div><div><br></div><div>Cheers,</div><div>-Felix</div><div><br></div><div><br></div><div><div><div>On 22 Jul 2014, at 14:24, Aravinda VK <<a href="mailto:hallimanearavind@gmail.com">hallimanearavind@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr"><div><div><div>Sorry for the incomplete mail.<br><br></div><div>What I wanted is,<br>get_value(MyStr("Rust".to_str())) returns String,<br>get_value(MyBool(true)) returns bool and,<br></div><div>get_value(MyInt(100)) returns int<br>
</div><div><br></div>I was trying to store generic value in hashmap, as in the example below,<br><br></div>use std::collections::hashmap::HashMap;<br><br>#[deriving(Show)]<br>enum MyTypes{<br>    MyBool(bool),<br>    MyStr(String),<br>
    MyInt(int)<br>}<br><br>fn main(){<br>    let mut settings:HashMap<String, MyTypes> = HashMap::new();<br><br>    settings.insert("port".to_str(), MyInt(8000));<br>    settings.insert("name".to_str(), MyStr("Rust".to_str()));<br>
    settings.insert("enabled".to_str(), MyBool(true));<br><br>    println!("{}", settings);<br>}<br><br></div><div>So to get the value out of hashmap, I need a generic function which checks the respective type and returns value. Some thing like<br>
<br>fn get_value(settings:HashMap<String, MyTypes>, key: &'static str) -> T{<br>    match settings.get(&key) {<br>        MyBool(x) => x,<br>        MyStr(x) => x,<br>        MyInt(x) => x<br>
    }<br>}<br><br></div><div>But I don't know how to make this work.<br><br></div><div>Thanks.<br></div><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jul 22, 2014 at 4:55 PM, Felix S. Klock II <span dir="ltr"><<a href="mailto:pnkfelix@mozilla.com" target="_blank">pnkfelix@mozilla.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Aravinda (cc’ing rust-dev)-<br>
<br>
You didn’t show us exactly what you had tried to do to get your code to work, nor did you really describe what it is you want here.<br>
<br>
E.g. you seem to want `get_value(MyBool(true))` to return a boolean, but since `MyBool` belongs to the `MyTypes` enum, that implies that `get_value` when applied to any variant of `MyTypes` (including `MyInt` or `MyStr`) should also return a boolean … does that seem right to you?<br>

<br>
In any case, I suspect the missing piece of the puzzle for you is that you need to write an `impl` for the type in question.  I.e. something along the lines of:<br>
<br>
impl MyTypes {<br>
    fn render(&self) -> String {<br>
        match *self {<br>
            MyBool(x) => format!("{:b}", x),<br>
            MyStr(ref x) => x.clone(),<br>
            MyInt(x) => format!("{:d}", x),<br>
        }<br>
    }<br>
}<br>
<br>
(except revised from an Impl for the type to being an impl of some trait for the type).<br>
<br>
Here is a link to a playpen with your code, and with a couple of example `impl`s for enums (like the one above) tossed in, including an impl of one instance of your `Value<S>` trait.<br>
<br>
  <a href="http://is.gd/RofN9R" target="_blank">http://is.gd/RofN9R</a><br>
<br>
There is more discussion of writing implementations that also provides an example with a simpler enum) in the Rust tutorial, see:<br>
<br>
  <a href="http://doc.rust-lang.org/tutorial.html#methods" target="_blank">http://doc.rust-lang.org/tutorial.html#methods</a><br>
<br>
Cheers,<br>
-Felix<br>
<div><div class="h5"><br>
On 22 Jul 2014, at 11:45, Aravinda VK <<a href="mailto:hallimanearavind@gmail.com">hallimanearavind@gmail.com</a>> wrote:<br>
<br>
> Hi,<br>
><br>
> I am trying to create a generic function to return value depending on the enum passed. But I don't know to create a generic trait for enum.<br>
><br>
> In following example, print_value works but I don't know how I can write a generic get_value function to get value from enum.<br>
><br>
> #[deriving(Show)]<br>
> enum MyTypes{<br>
>     MyBool(bool),<br>
>     MyStr(String),<br>
>     MyInt(int)<br>
> }<br>
><br>
> fn print_value(arg: MyTypes){<br>
>     match arg{<br>
>         MyBool(x) => println!("Bool: {}", x),<br>
>         MyStr(x) => println!("String: {}", x),<br>
>         MyInt(x) => println!("Int: {}", x),<br>
>     }<br>
> }<br>
><br>
><br>
> fn main(){<br>
>     print_value(MyBool(true));<br>
><br>
>     // Following lines not working, how to write get_value func?<br>
>     // let a: bool = get_value(MyBool(true));<br>
>     // println!("{}", a);<br>
> }<br>
><br>
><br>
> In case of struct it is simple,<br>
><br>
> struct MyInt {<br>
>     value: int<br>
> }<br>
><br>
> struct MyBool{<br>
>     value: bool<br>
> }<br>
><br>
> trait Value<S>{<br>
>     fn get(&self) -> S;<br>
> }<br>
><br>
> impl Value<int> for MyInt{<br>
>     fn get(&self) -> int{<br>
>         self.value<br>
>     }<br>
> }<br>
><br>
> impl Value<bool> for MyBool{<br>
>     fn get(&self) -> bool{<br>
>         self.value<br>
>     }<br>
> }<br>
><br>
> fn get_value<S, T: Value<S>>(arg: T) -> S{<br>
>     arg.get()<br>
> }<br>
><br>
> fn main(){<br>
>     let a: bool = get_value(MyBool{value: true});<br>
>     println!("{}", a);<br>
><br>
>     let b: int = get_value(MyInt{value: 100});<br>
>     println!("{}", b);<br>
> }<br>
><br>
> Please help in writing generic function for enum.<br>
><br>
><br>
><br>
> --<br>
> Regards<br>
> Aravinda | ಅರವಿಂದ<br>
> <a href="http://aravindavk.in/" target="_blank">http://aravindavk.in</a><br>
</div></div>> _______________________________________________<br>
> Rust-dev mailing list<br>
> <a href="mailto:Rust-dev@mozilla.org">Rust-dev@mozilla.org</a><br>
> <a href="https://mail.mozilla.org/listinfo/rust-dev" target="_blank">https://mail.mozilla.org/listinfo/rust-dev</a><br>
<br>
</blockquote></div><br><br clear="all"><br>-- <br>Regards <br>Aravinda | ಅರವಿಂದ <br><a href="http://aravindavk.in/">http://aravindavk.in</a>
</div>
</blockquote></div><br></div></body></html>