In article <92ofbg$ib$1 / schur.institut.math.jussieu.fr>,
Jean Michel <jmichel / schur.institut.math.jussieu.fr> wrote:
>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