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