This is a short template of what one can do when dealing with the perfect storm of complication using attached variables. This issue can arise when you need to attempt to release a resource, e.g. closing a file, that was created during a creation procedure, and you want the file to be attached in the enclosing class.
Say, for instance, in the below example we didn't use `the_file' and just used an attached `file'. The rescue clause would not compile because it's not assured that the creation procedure for the file completed. We need an intermediary reference that is detached, to use in the rescue clause.
make_from_file (file_name: STRING) local the_file: detachable RAW_FILE -- This is the object we'll use to close the file in case of exception. do create file.make_open_read (file_name) the_fileĀ := file parse_file -- Operate on attached member variable file `file' file.close rescue if attached {RAW_FILE} the_file as x then -- If file was never created, we won't attempt to close x.close -- If there was an error while parsing, attempt to close end end file: RAW_FILE
With this creation procedure you can be sure your file will always be closed and file is an attached member of the class.
Comments
I think you should write
I think you should write your creation code as:
What's the advantage that
What's the advantage that way?
I suppose in general it's
I suppose in general it's better to assign to a detachable type from an attached type. In this case there isn't an issue because it's a local. I'll switch it around.