From: Michael Fellinger Date: 2007-02-07T15:11:53+09:00 Subject: Re: Question about closure example on p. 56 of pickaxe book On 2/7/07, Alex Strasheim 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