Reputation: 3079
In know that I can manipulate a Ruby default Hash
value like this:
h={a:1, b:2, c:3}
h[:x] # => nil
h.default = 5
h[:x] # => 5
h.default = 8
h[:y] # => 8
but this gets quite tedious when doing it repeatedly for multiple values with different defaults.
It also could get dangerous if the hash is passed to other methods which want their own defaults for certain (potentially missing) keys.
In Python, I used to
d={'a':1, 'b':2, 'c':3}
d.get('x', 5) # => 5
d.get('y', 8) # => 8
which doesn't have any side-effects. Is there an equivalent of this get
method in Ruby?
Upvotes: 13
Views: 7711
Reputation: 4387
An alternative to #fetch
is to simply do something like this:
h[:x] || 5
In Python missing keys will raise a KeyError, but in Ruby missing keys simply return nil.
This has a subtly different meaning, because the default will happen if either:
nil
whereas fetch will only make an impact in scenario 1.
The closest Python equivalent of this code is
h.get('x') or 5
(Note though that this is still different since truthiness/falsiness is different in Python than in Ruby)
Upvotes: 1
Reputation: 159955
Yes, it is called fetch
, and it can also take a block:
h.fetch(:x, 5)
h.fetch(:x) {|missing_key| "Unfortunately #{missing_key} is not available"}
Upvotes: 27