Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

1) I think I've had 4 different people try to explain lifetimes to me and I still don't think I understand.

2) The use of pointer dereferencing in closures is still quite confusing to me. For example, from the tutorial:

  let square = |x: int| -> uint { (x * x) as uint };
no pointer dereferencing, yet:

  [1, 2, 3].map(|x| if *x > max { max = *x });
uses pointer dereferencing. I can't figure out any rhyme or reason behind it.

3) How do you create traits that can be automatically derived? How do you implement a default method?

4) How do you create and use macros, and in what situations are they the appropriate solution over other forms? (I'm used to using macros in lispy languages, but using them as pervasively in other languages seems to be a form of code smell).



Maybe this will be useful to understanding lifetimes: http://static.rust-lang.org/doc/0.8/tutorial-borrowed-ptr.ht...

As for the pointer dereferencing, perhaps putting the type there will make it clearer:

    [1, 2, 3].map(|x: &int| if *x > max { max = *x });
Now you can see that x isn't actually an int but a reference to one.

As for automatically derived traits, those are actually slightly more powerful macros implemented in the compiler itself. You can see it at rust/src/libsyntax/ext/*.

For default methods, you just put the code you want in the trait itself. Like so:

    trait Animal {
        fn sound(&self) -> ~str;
        fn make_sound(&self) {
            println(self.sound());
        }
    }
The make_sound method is what's called a default method. If you implemented that trait, at the very least you would have to define the sound method and if you wanted to, you could override the default make_sound method.

Macros are actually created with another macro called macro_rules. I'll defer to the tutorial for them: http://static.rust-lang.org/doc/0.8/tutorial-macros.html


> How do you create and use macros, and in what situations are they the appropriate solution over other forms?

I would say to follow a Lisp rule, I like to follow in all languages that have macro support, "only implement a macro if it cannot be done with a function".




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: