On 2/7/07, Alex Strasheim <astrashe / gmail.com> wrote:
> I'm new to both Ruby and closures, and I'm trying to nail down exactly
> what's going on in an example on p. 56 in the 2nd edition of
> Programming Ruby:
>
>   songlist = SongList.new
>
>   class JukeboxButton < Button
>
>     def initialize(label, &action)
>       super(label)
>       @action = action
>     end
>
>     def button_pressed
>       @action.call(self)
>     end
>
>   end
>
>   start_button = JukeboxButton.new("Start") { songlist.start }
>   pause_button = JukeboxButton.new("Pause") {songlist.pause }
>
> (I typed this in manually, so if there are typos, they come from me,
> and not the book.)
>
> I understand that @action is an instance variable that points to a
> Proc object containing the block of code in the curly brackets.  And I
> think I understand the idea that the context of the block is saved
> along with the code in the Proc object.
>
> What I don't understand is why we need the parameter "self" in:
>
>   @action.call(self)
>
> When someone presses the start button, that generates a call to
> start_button.button_pressed, right?  So when we run that method, we do
> @action.call, which would songlist.start to run.
>
> Why do we need "self"?  Doesn't "self" refer to start_button, which is
> an instance of JukeboxButton?  Why would songlist need to know about
> the button?
>
> And if we were going to pass a parameter when we run @action.call,
> wouldn't the block of code need to have a parameter in it?  Like this:
>
>   start_button = JukeboxButton.new("Start") { |x| songlist.start }
>
> I realize that doesn't make sense -- the parameter isn't used in that
> code block.  But I'm pretty confused by what's going on here.
>
> Thanks (and I hope this isn't too dumb, or inappropriate.)

Your question is understandable, and it's a bit odd that they pass
self as an parameter since it's not used at all.
My advice: ignore it.
Might be something that slipped through the final review or something.
There is no hidden meaning and it works perfectly without passing
self.

Hope that clears things up,
^ manveru