From: Nicholas Frechette Date: 2006-10-15T22:18:36+09:00 Subject: File is a special class? Hi, I'm currently working on a side project which has me store binary content in memory. In order to make it's use as transparent as possible, i overloaded the 'require' method to search as well in the memory and this works fine at the moment. In the same line of thought, I tried changing the way File.new works to return a StringIO object pointing to my binary data in memory instead of an ordinary IO object... However, i ran into an interesting problem. Consider the following code: class File alias_method :old_new, :initialize def initialize(*args) if args[0] == 'a.txt' # Do not return a file object, return say, a Hash Hash.new else old_new(*args) end end end o = File.new('a.txt') puts "Object is of class: #{o.class}" This outputs: Object is of class: File Obviously. Now, looking further for alternatives, i tried to overload Class.new. Consider the following code: class Foo end class Bar end class Class alias oldNew new def new(*args) print "Creating a new ", self.name, "\n" if self.name == 'File' require 'stringio' StringIO.new('This is a string!','r') elsif self.name == 'Foo' Bar.new else oldNew(*args) end end end d = Foo.new puts "Should be type Foo and is: #{d.class}" n = File.new('lol.rb','r') puts "Should be type StringIO and is: #{n.class}" puts "Content is: #{n.read}" With a file named lol.rb in my path with the single line of content: "Hello", this outputted: Creating a new Foo Creating a new Bar Should be type Foo and is: Bar Should be type StringIO and is: File Content is: Hello ========================== Two things here: Class.new is working as expected with Foo, returning a Bar object. But, when File.new is called, Class.new is not called as it was for Foo.new! Any thoughts/help please? I have ran out of ideas... An obvious solution is to use a different constructor that is not File.new but that would make it not very elegant. Thanks and regards. Nicholas