[#1649] Re: New Ruby projects — Yukihiro Matsumoto <matz@...>
The following message is a courtesy copy of an article
[#1672] Re: Ruby 1.4 stable manual bug? — Yukihiro Matsumoto <matz@...>
The following message is a courtesy copy of an article
[#1673] Re: Possible problem with ext/socket in 1.5.2 — itojun@...
[#1694] Conventions for our Ruby book — Dave Thomas <Dave@...>
[#1715] Install postgresql support — Ikhlasul Amal <amal@...>
Hi all,
Hi,
[#1786] Is this a bug? — Clemens Hintze <clemens.hintze@...>
(mailed & posted)
[#1814] Objects nested sometimes. — Hugh Sasse Staff Elec Eng <hgs@...>
I am attemptiong to write a package which consists of a workspace
[#1816] Ruby 1.5.3 under Tru64 (Alpha)? — Clemens Hintze <clemens.hintze@...>
Hi all,
Hi,
Yukihiro Matsumoto writes:
Hi,
Hi,
[#1834] enum examples? — Hugh Sasse Staff Elec Eng <hgs@...>
Has anyone any examplse of using the Enumerable module? I've had a
[#1844] Minor irritation, can't figure out how to patch it though! — Hugh Sasse Staff Elec Eng <hgs@...>
I was considering how difficult it would be to patch Ruby to accept
[#1889] [ruby-1.5.3] require / SAFE — ts <decoux@...>
[#1896] Ruby Syntax similar to other languages? — "David Douthitt" <DDouthitt@...>
From: Yukihiro Matsumoto <matz@netlab.co.jp>
[#1900] Enumerations and all that. — Hugh Sasse Staff Elec Eng <hgs@...>
Thank you to the people who responded to my questions about Enumerated
Hugh Sasse Staff Elec Eng <hgs@dmu.ac.uk> writes:
On 16 Mar 2000, Dave Thomas wrote:
[#1929] Re: Class Variables — "David Douthitt" <DDouthitt@...>
| "David Douthitt" <DDouthitt@cuna.com> writes:
[#1942] no Fixnum#new ? — Quinn Dunkan <quinn@...>
Ok, I can add methods to a built-in class well enough (yes I know about succ,
[#1989] English Ruby/Gtk Tutorial? — schneik@...
Hi,
[#2022] rb_global_entry — ts <decoux@...>
[#2036] Anonymous and Singleton Classes — B_DAVISON <Bob.Davison@...>
I am a Ruby newbie and having some problems getting my mind around certain
[#2069] Ruby/GTK+ question about imlib --> gdk-pixbug — schneik@...
[#2073] Re: eval.rb fails — "Dat Nguyen" <thucdat@...>
The doc is fine, this happens only if you try to execute 'until' block
On Wed, 22 Mar 2000, Dat Nguyen wrote:
[#2084] Scope violated by import via 'require'? — Clemens Hintze <c.hintze@...>
Hi,
[#2104] ARGF or $< — Hugh Sasse Staff Elec Eng <hgs@...>
Has anyone any examples of how to use ARGF or $< as I cannot find much
Hi.
[#2165] Ruby strict mode and stand-alone executables. — "Conrad Schneiker" <schneiker@...>
Some people want Ruby to have a strict compile mode.
[#2203] Re: parse bug in 1.5 — schneik@...
[#2212] Re: Ruby/Glade usage questions. — ts <decoux@...>
>>>>> "m" == mrilu <mrilu@ale.cx> writes:
[#2241] setter() for local variables — ts <decoux@...>
[#2256] Multiple assignment of pattern match results. — schneik@...
[#2267] Re: Ruby and Eiffel — h.fulton@...
[#2309] Question about attribute writers — Dave Thomas <Dave@...>
Clemens Hintze <c.hintze@gmx.net> writes:
[ruby-talk:01924] Re: Enumerations and all that.
Well, I've thinking about enumerated types, and was wondering how they
fit in to a typeless language.
I came to the conclusion that there cannot be such things as free
standing enumerated objects, because the semantics would be all
wrong. If we have
thing = Enum.new(:red, :green, :blue)
Then how can we use it? We can have
thing.set(:red)
and
thing.value #-> :red
but does that help? Not really, because nothing stops you having
thing = 'wombat'
To my mind, the benefit of enumerated types comes from ensuring that
the range of values taken by something is predetermined, and we can't
do that with free variables.
However, we probably don't want to do it with free variables. Instead,
we want to make sure that the parameter to our Door#setState method is
either :open or :closed. So it seems to make sense to have enumerated
types associated with class attributes.
So, I came up with the following. Here's a class Spigot with two
enumerated type attributes:
class Spigot
enum :color, [ :red, :green, :blue ]
enum :size, { :small => -1, :medium => 0, :large => 99}
end
The 'color' attribute has the external values :red, :green, and
:blue. Because there are no associated internal values, they will be
set to 0, 1, and 2.
The 'size' attribute does have internal values associated with the
three external ones.
The external world can set and query the value of either of these
object attributes:
s = Spigot.new
s.color = :red
s.size = :large
p s.color
p s.size
However, if you try to set an attribute using a value that's not
associated with it, a TypeError is raised:
s.color = :large #-> TypeError
Finally, within class Spigot, you can get to the internal value of an
attribute using <attribute>_val. If the size is set to :large,
size_val will return 99.
class Spigot
def printState
printf "Internal value of color is #{color_val}\n"
printf "Internal value of size is #{size_val}\n"
end
end
I implemented 'enum' by extending class Module. It's a fairly ugly
hack right now, but there's scope for it to be tidied...
Anyway, here's all the code. It works under 1.5, but I'm not sure if
the new Symbol stuff means it doesn't work under 1.4.
I'd be interested in comments.
Dave
############################ cut here #############################
class Module
def enum(nameSym, vals)
n = nameSym.id2name
iVar = "_#{n}_var"
keys = "K_#{n}_keys"
class_eval "def #{n}() @#{iVar} end"
class_eval "def #{n}=(val)
puts #{keys}.inspect
raise TypeError unless #{keys}.has_key?(val)
@#{iVar} = val
end"
class_eval "def #{n}_val() #{keys}[@#{iVar}] end"
class_eval "#{keys} = Hash.new"
if Hash === vals
vals.each_pair do |key, val|
class_eval "#{keys}[#{key}] = #{val}"
end
else
vals.each_index do |i|
class_eval "#{keys}[#{vals[i]}] = #{i}"
end
end
end
end
###################################################################
class Spigot
enum :color, [ :red, :green, :blue ]
enum :size, { :small => -1, :medium => 0, :large => 99}
def printState
printf "Internal value of color is #{color_val}\n"
printf "Internal value of size is #{size_val}\n"
end
end
s = Spigot.new
s.color = :red
s.size = :large
p s.color
p s.size
s.printState
s.color = :large # fails