Ah yes, your example would be more readable than my example. However, for a non-scripter, I still think that structure still would be confusing. I know, there's not much you can do about that in the first place (there will always be a certain level of confusion), which is why I believe these kinds of things were not suited for arrays/hashes at all, and creating either a struct or class based around the model would be more efficient...as well as it could be added to the existing actor data structures:
$data_actors[1].gender = 'Male'
$data_actors[2].age = 13
With the enumeration, that's what I was referring to, by being easier for non-scripters to add features (then, features are simply added, rather than added, then manually drawn).
The issue with enumeration (in this case), is that you still need some way to handle A) Multi-line features (such as biography/history). B) Features in different columns.
(Otherwise, you are absolutely correct about the enumeration, although the current design *may* need to change in order to fit enumeration better...unless you want to write some algorithms to correctly determine/split up multiple lines, as well as add a way to customize which column the feature is placed in, and auto-sizing/positioning, etc.)
But really, in the end, it's difficult to design scripts for non-scripters to work with. There isn't really a "best" model, in those terms. Which is why *I personally believe* that a structured, object model is the best...after all, ruby is object oriented.
My personal preference, for customizable, list-based data structures would be:
# Pretend we have the user modify a text file that defines an actor's
# Biography:
def biography(id)
case id
when 1 then "aluxes_bio.txt"
when 2 then "basil_bio.txt"
end
end
I believe, that "when x then y" is easier to comprehend, than "= [ { key => value } ]" for non-scripters. But, that's what I believe...and that would depend on the user as well.
This also means, performance-wise, that no array/hash/string/objects are even instantiated/stored in memory, until used and they definitely, do not persist in memory for the entire running-time of the game.
EDIT: Oh yea, forgot to mention, being a lazy programmer, to an extent (especially in the context you are referring to it) is a good thing. The number one philosophy in the Ruby community (and with most languages as well) is DRY (Don't Repeat Yourself), which I am sure you have heard a lot. It's easier to do this with duck-typing...which is why Ruby is really focussed around these concepts.