<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>