On Wednesday 28 December 2005 03:00 pm, James Edward Gray II wrote:
> On Dec 28, 2005, at 1:47 PM, Steve Litt wrote:
> > On Wednesday 28 December 2005 02:32 pm, Alex Knaub wrote:
> >> 2005/12/28, Surgeon <biyokuantum / gmail.com>:
> >>> Hi,
> >>>
> >>> I am a Ruby newbie. I wish I didn't post such a simple question here
> >>> but I had to.
> >>> What is the difference between :foo (a keyword) and "foo"(a string).
> >>> Can they be used interchangeably? Are they fundamentally same and is
> >>> the only difference performance?
> >>
> >> http://onestepback.org/index.cgi/Tech/Ruby/
> >> SymbolsAreNotImmutableStrings.re
> >> d
> >
> > The preceding URL tells me unequivically that symbols aren't
> > strings, but
> > really doesn't tell me too much about what they are, other than what,
> > names???
>
> As one of the people guilty of saying what that article says we
> shouldn't, I better try to get back in Jim's good graces by answering
> this one...  ;)
>
> > I still don't understand why it's
> >
> > attr_reader :fname, :lname
> >
> > instead of
> >
> > attr_reader @fname, @lname
> >
> > How does attr_reader know that :fname corresponds to @fname. Seems
> > like magic
> > to me.
>
> Attributes of a class logically correspond to instance variables in
> many cases, don't you think?  Ruby's just making that assumption for
> you.
>
> When I see:
>
>    some_call @my_variable
>
> I expect what is held inside of @my_variable to get passed to
> some_call(), not the variable name itself.  

Oh, I get it!!!

In see itwould be some_call(&@my_variable), and in ruby it's 
some_call(:my_variable). One thing -- why not some_call(:@my_variable)?  


> What you describe would 
> be the opposite and that would surely surprise a lot of people.
>
> Furthermore, Symbols are commonly used to refer to method names (as
> Ruby uses them for this internally).  That's really what we are doing
> here, creating new methods by name, so it's a good fit.

Ah ha! That's why I need to pass callback routines entry and exit that occur 
in object cb, like this:

walker = Walker.new(node, cb.method(:entry), cb.method(:exit))

SteveT

Steve Litt
http://www.troubleshooters.com
slitt / troubleshooters.com