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