D
David Brady
Okay, one more question from a C++ leopard trying to change his spots:
I want to set up a program that uses some predefined values to determine
its logic. For example, a method could analyze some data and return
"Good", "Fair", "Poor", or "Out of Bounds" based on a set of
thresholds. I want to be able to refer to these values by name in my
code, so constants or symbols make a good choice here. But I also want
to build a sort of rule set around these values: some function returns
values in the range of (0.0..1.0) and I want to be able to say that 0.8
is the minimum score for "Good", etc. I also want the word "Good"
stored in a specific single place so that I don't make any typos each
time I need to print the description.
In C++, I would use an enum for each of the values, then build arrays of
floats and strings indexed by those enums to hold the thresholds and
descriptions.
What's the Ruby idiom for this?
Perhaps Struct followed by some initializer arrays? This seems like a
good start but I end up wanting to build a set of constants first to use
as keys to a hash containing the Structs. Perhaps the Structs should be
the constants themselves, like:
Struct.new("RatingData", name, threshold, description)
RATING_GOOD = Struct::RatingData( :Good, 0.8, "Good Rating" )
RATING_FAIR = Struct::RatingData( :Fair, 0.5, "Fair Rating" )
...etc. The analyze_data could return RATING_GOOD if things were fine. So:
rating = analyze_data data
puts "Analysis: #{rating.description}"
Though this doesn't let me treat the values as though they are ordered, e.g.
puts "*** Warning: Rating below Fair ***" if rating < RATING_FAIR
Thoughts?
-dB
I want to set up a program that uses some predefined values to determine
its logic. For example, a method could analyze some data and return
"Good", "Fair", "Poor", or "Out of Bounds" based on a set of
thresholds. I want to be able to refer to these values by name in my
code, so constants or symbols make a good choice here. But I also want
to build a sort of rule set around these values: some function returns
values in the range of (0.0..1.0) and I want to be able to say that 0.8
is the minimum score for "Good", etc. I also want the word "Good"
stored in a specific single place so that I don't make any typos each
time I need to print the description.
In C++, I would use an enum for each of the values, then build arrays of
floats and strings indexed by those enums to hold the thresholds and
descriptions.
What's the Ruby idiom for this?
Perhaps Struct followed by some initializer arrays? This seems like a
good start but I end up wanting to build a set of constants first to use
as keys to a hash containing the Structs. Perhaps the Structs should be
the constants themselves, like:
Struct.new("RatingData", name, threshold, description)
RATING_GOOD = Struct::RatingData( :Good, 0.8, "Good Rating" )
RATING_FAIR = Struct::RatingData( :Fair, 0.5, "Fair Rating" )
...etc. The analyze_data could return RATING_GOOD if things were fine. So:
rating = analyze_data data
puts "Analysis: #{rating.description}"
Though this doesn't let me treat the values as though they are ordered, e.g.
puts "*** Warning: Rating below Fair ***" if rating < RATING_FAIR
Thoughts?
-dB