On Sep 26, 8:49 am, David Jenkins <[email protected]> wrote:
> I did some research into hashes, and sure enough this is the default
> behavior: aHash[:nonexistentkey] returns nil.  I then found this at
> stackoverflow:http://stackoverflow.com/questions/164714/how-can-i-use-c-style-enume...
>
> <http://stackoverflow.com/questions/164714/how-can-i-use-c-style-enume...>
> specifically,
>
> STATES = Hash.new { |hash, key| raise NameError, "#{key} is not allowed" }
>
> STATES.merge!({:open => 1, :closed => 2, :max => 3, :min => 4}).freeze()
>
> STATES[:other] # raises NameError
>
> I tried this (*omitting the .freeze() since it adds extraneous elements to
> our discussion)*, and it worked as expected, i.e., raised an error when
> referencing STATES[:other]. I would think this would be a great time-saver
> to have in Sequel, given that typos happen and even at runtime they won't
> reveal themselves in the current setup.
>
> Again, being a ruby newb, I'd love to hear other thoughts on this issue.

No, I don't think this is a good idea.  Beyond breaking backward
compatibility, it goes against standard ruby behavior.  If you want an
error raised for a nonexistent key, you use Hash#fetch.

I'm sure it takes some getting used to if you come from a static
language where the compiler would catch similar errors (or python,
where it causes a KeyError).  However, it's not generally an issue for
experienced ruby programmers.

BTW, your problem would have been easily caught by most of the people
that responded to this thread if you didn't "clean up" the code.  In
the future, just paste what you have verbatim.

The great thing about ruby is that it's easily possible to have the
behavior you desire by adding it yourself.  For a single dataset, you
could do:

  def dataset.fetch_rows(*args)
    h = Hash.new { |hash, key| raise NameError, "#{key} is not
allowed" }
    super(*args){|r| yield h.merge(r)}
  end

For all datasets for a given database:

  def DB.dataset(*args, &block)
    dataset = super
    def dataset.fetch_rows(*args)
      h = Hash.new { |hash, key| raise NameError, "#{key} is not
allowed" }
      super(*args){|r| yield h.merge(r)}
    end
    dataset
  end

Jeremy
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to