From: "Jesús Gabriel y Galán" Date: 2008-08-19T15:13:30+09:00 Subject: Re: passing a variable from a block back to the method On Tue, Aug 19, 2008 at 7:21 AM, James Dinkel wrote: > I have several files that I have to read, check the contents, and then > write any changes. I overloaded the File class to help me out with > this: > This is a huge waste if the files don't change (as they often don't). > The problem I'm having is with the "# decide not to change anything" in > the block and passing that back to the method so "# return if not > changing anything" knows the answer. I'm not sure if I can pass an > instance variable around to do this? I don't really know how that would > work since I don't really have an instance of file to work with. > > Maybe someone has some ideas? Untested, but what about: ---------------------------------------------------------- class File def self.change(filename) # read the file, execute a block, then write the file File.open(filename, 'r+') do |file| lines = file.readlines new_lines = yield lines # return if not changing anything return unless new_lines file.pos = 0 file.print new_lines file.truncate(file.pos) end end end ---------------------------------------------------------- The method is called with: ---------------------------------------------------------- File.change('awesomefile') do |contents| contents.collect! do |line| # magic happens # decide not to change anything --> the last statement evaluates to nil nil # when you want to return the new lines end end ---------------------------------------------------------- Of course you should change the logic in the block to not be within a collect! when you want to return nil. Hope this helps, Jesus.