Inspect Eval File Format

To write a quicky document format with RubyLanguage, follow these simple steps:

Put primitive data types into a dictionary:

        settings = {
                    'name' => aGadget.getName(),
                    'source' => aGadget.getSource(),
                    'xy' => aGadget.getXY()
                    }
Open a file, and "inspect" in the dictionary. This writes, as text, the Ruby source required to declare that dictionary, and all its primitive contents, as a constant literal dictionary declaration:

        f.write(settings.inspect())
To read, scoop out the file contents and drop them into "eval". This reconstitutes the dictionary:

    f = File.open (fileName)
    fileContents = f.read()
    f.close()
    settings = eval(fileContents)
--PhlIp

This is documented as the Active File pattern at http://www.doc.ic.ac.uk/~np2/patterns/scripting/data-as-code.html. --NatPryce


What if some malicious person alters your file and puts in the Ruby equivalent of "rm -rf /"?

If you need to deal with potentially hostile data, then either use Ruby's security features, or just use some other format.


Is there some reason why your reconstitution code isn't just:

    settings = eval(File.read(fileName))
(If the File.read method doesn't exist in your version of Ruby, add it. ;)

'Cause we should BreakLongLines when there are too many activities on one line.


OK, but this is Ruby -- we don't have to be so verbose to say it clearly:

 file_contents = File.open file_name {|f| f.read}
 settings = eval file_contents
or using read as described above:

 file_contents = File.read file_name
 settings = eval file_contents


To pump entire objects thru this system, override 'inspect' and make it emit a call to the object's constructor with enough arguments to re-construct it sufficiently for reconstitution purposes.


Is there a reason that you use this method and not RubyLanguage's Marshal (http://www.rubycentral.com/book/ref_m_marshal.html#Marshal.dump) class?

Marshal is a much better alternative in most cases. This seems like re-inventing the wheel. For the love of DRY, people, use what Matz gave ya!


EditText of this page (last edited October 28, 2006) or FindPage with title or text search