In article <3a4fa593$0$2770$65a95bcd / news.citilink.com>,
Josh Stern <jstern / foshay.citilink.com> wrote:
>Jean Michel <jmichel / schur.institut.math.jussieu.fr> wrote:
>>Kevin Smith  <sent / qualitycode.com> wrote:
>
>>I do not think this solves my  problem. I will give the specific example
>>where I  had the problem  to show  it: I have  as an exercise  written a
>>program to  get an ID3V2 tag  from a .mp3  file. I have defined  a class
>>ID3V2tag and  a method  read_ID3V2tag in  class IO  which returns  a new
>>object of class ID3V2tag (or nil if no such tag was found in the file).
>>
>> Now, I want to re-use my code to parse an ID3V3 tag sitting in a string
>>in memory. In C++, I can just  make the string into an istringstream and
>>share the same code.  I don't see how I can share  the code between both
>>situations in  ruby (of  course there would  be a way:  put the  code in
>>class String and read the file in memory; but this is not desirable with
>>multi-megabyte  files!). It  seems that  I need  a class  in which  both
>>strings and  files can belong, but  I cannot do it  since neither String
>>nor IO is a module. What did I miss here?
>
>I think you haven't adequately explained to the Ruby developers
>what it is that you really want.
>
>What is missing from the discussion is a description
>of the specific API that is to be shared and what amount of code 
>resuse one has in mind.
....
I think that these questions and the  rest of your answer are beside the
point. But, since my last post, further thought has led me to a solution
(if you like it it can be in the  FAQ, Dave). The API from IO that I use
is just  for now .read  and .seek  but I may  want to use  other methods
eventually. The solution to share code is

 1- Derive a class from String that  has methods .read and .seek . I say
 derive a  class because  I need  to add  an instance  variable 'current
 pointer' and it  seems cleaner to have  this in a new  class. But since
 instance  variables can  magically appear  maybe  I need  not derive  a
 class. I can just do:

   class String
     def as_file
       @current_pointer=0
     end
     def read(n)
       @current_pointer+=n
       if @current_pointer>=length
         @current_pointer=length-1
	 nil
       else
         @current_pointer+=n
	 self(@current_pointer-n..@current_pointer-1)
       end
     end
     etc...

 2- The key  point is to implement my functionality  .read_ID3V2tag in a
 Module. Then  I can include  my module both in  class IO and  (the new)
 class String, and voila! The job is done.

Kudos again to ruby in this case.
If this technique seems the right  one then to prompt programmers to use
it one would  wish that the library had  pre-defined this String-as-file
derived from string with these IO methods added.

Best regards,
    Jean MICHEL