I'm just breaking into the ruby world and I could use a helping hand.
Suppose b
is nil
.
I'd like the following code to return nil
instead of a "NoMethodError: undefined method"
a.b.c("d").e
The first thing I tried was to overload NilClass's missing_method to simply return a nil. This is the behaviour I want except I don't want to be this intrusive.
I'd love it if I could do something like this
SafeNils.a.b.c("d").e
So it's like a clean way to locally overload the NilClass's behaviour.
I'd love to hear some ideas or great resources for digging in on this. I'm also quite open to other approaches as long as it's fairly clean.
Thank you very much.
To use a
safe_nils
similar to that you wrote:One approach is to use inline assignment to local variables:
For as long a chain as you've got here it isn't very elegant, but for a shorter chain it can be useful:
Remark in advance:
b
is a method, not a variable. So b 'is' not nil, it returns nil.When 'b' is a method, why not modify b, so it returns something, what can handle nil.
See below for an example.
You may define the missing methods:
But I think, a rescue may fit your need better:
An example, how you may define a nil-like example.
You can use the inline rescue:
x
will benil
ifb
isnil
.Or, as someone commented in that link, you can use the andand gem (see docs):
I've made the
may_nil
gem for this. https://github.com/meesern/may_nilLike @Sony Santos's safe_nils answer it uses a block to wrap the method chain and rescues NoMethodError, but will check for nil (and so will properly raise an exception for other classes).
Unlike
andand
orike
'smaybe
you don't need to pepper the method chain."try" is very clean, as lucapette said. More generally, you could also use a begin-rescue-end block too, depending on your situation.