William James wrote:
> john_sips_tea / yahoo.com wrote:
> > Hi,
> >
> > I'm reading through the poignant guide, and am a bit stuck
> > at the end of chapter 4
> > ( http://poignantguide.net/ruby/chapter-4.html ). It's
> > regarding the kitty_toys example:
> >
> > #!/usr/bin/ruby
> >
> > kitty_toys =
> >     [:shape => 'sock', :fabric => 'cashmere'] +
> >     [:shape => 'mouse', :fabric => 'calico'] +
> >     [:shape => 'eggroll', :fabric => 'chenille']
> >
> > kitty_toys.sort_by { |toy| toy[:shape] }.each do |toy|
> >     puts "Blixy has a #{ toy[:shape] } made of #{ toy[:fabric] }"
> > end
> >
> > and I've actually got three sticking points with it:
> >
> > 1. For one thing, I don't understand the point of the ":shape"
> > syntax. I don't understand why the author doesn't just write
> > the string "shape" instead. What exactly is a "Symbol" object
> > for?
> >
> > The poinant guide says it's just "words that look just like
> > variables". And "Symbols are lightweight strings." But that
> > doesn't help me much. The PickAxe 2nd ed, in chapter 3 says,
> > "The construct :artist is an expression that returns a Symbol
> > object corresponding to artist.", so, I can understand that
> > (i.e. that there's some Symbol class and we're getting an
> > instance of it by using that notation), but I'm still not
> > getting the point... why not just use strings? What does
> > having "Symbols" buy the programmer?
> >
> > 2. Next up, why is
> >
> > kitty_toys =
> >     [:shape => 'sock', :fabric => 'cashmere'] +
> >     [:shape => 'mouse', :fabric => 'calico'] +
> >     [:shape => 'eggroll', :fabric => 'chenille']
> >
> > supposed to be shorthand for
> >
> > kitty_toys = [
> >     {:shape => 'sock', :fabric => 'cashmere'},
> >     {:shape => 'mouse', :fabric => 'calico'},
> >     {:shape => 'eggroll', :fabric => 'chenille'}
> > ]
> >
> > How does that work? (Hmm... what does adding Arrays
> > in Ruby mean anyway? In Python it concatenates.)
> > Why does this shorthand exist? Hmm,.. it doesn't seem
> > to be saving much finger typing...
> >
> > 3. Finally, at the end of that example given in the poignant
> > guide:
> >
> > #!/usr/bin/ruby
> >
> > # ... Create kitty_toys as shown above, then
> >
> > kitty_toys.sort_by { |toy| toy[:shape] }.each do |toy|
> >     puts "Blixy has a #{ toy[:shape] } made of #{ toy[:fabric] }"
> > end
> >
> > how does that "kitty_toys.sort_by" line work? I believe that
> > braces and "do ... end" are equivalent, so it looks to me like
> > there's some kind of "loop-in-a-loop" going on, as in:
>
> No, kitty_toys.sort_by { |toy| toy[:shape] } simply produces an
> array that's sorted by the shape of each toy.  Then he
> iterates through the array and prints each toy.
>
> >
> > # Warning, Python code follows:
> > for i in range(1, 8):
> >     for j in range(1, 4):
> >         print i, j
> >
> > Is there a more verbose way of writing that kitty_toys snippet
> > to make it a bit more obvious what's going on? I mean, I guess
> > the sort_by method is probably looking for something to sort
> > kitty_toys on, and we're telling it to use what it finds in
> > toy[:shape] for each hash it iterates over, but then, is that
> > next "each" looping over items in a given hash, or ... gah. I'm
> > not getting it. :)
> >
> > Thanks,
> > ---John
>
> Here's another way:
>
> kitty_toys =
>   [ { :shape, 'sock',     :fabric, 'cashmere'},
>     { :shape, 'mouse',    :fabric, 'calico'},
>     { :shape, 'eggroll',  :fabric, 'chenille'}
>   ]
>
> puts kitty_toys.sort_by { |toy| toy[:shape] }.map { |toy|
>     "Blixy has a #{ toy[:shape] } made of #{ toy[:fabric] }"
> }

kitty_toys =
  { :shape, 'sock',     :fabric, 'cashmere'},
  { :shape, 'mouse',    :fabric, 'calico'},
  { :shape, 'eggroll',  :fabric, 'chenille'}