On Jul 17, 8:52 pm, Jeff Pritchard <j... / jeffpritchard.com> wrote: > I'm a relative newbie. I'm finally getting the hang of some of the > syntactic sugar provided, such as the whole thing about using the "or" > operator to provide a default value if something is nil: > > foo = bar || "emptiness" > > One thing I keep running into over and over and over and over that I > wish there was some syntactic sugar for is the whole business of calling > a method on an object, and doing something intelligent if the object is > nil. > > If I have a string of stuff like: > blah = foo.bar.split > > what if bar is nil? There are obvious long hand ways to deal with this, > but then you loose the smoothness of lining up things like this in Ruby. > > I guess what I want is some syntactic sugar that means "this object, or > an empty one of these if this is nil", so that I would get an empty > result instead of a nil object missing method error. > > I would like to be able to write: > blah = foo.bar||empty(bar).split > > This could be written: > blah = foo.bar||"".split > > But that requires a well known object type for bar. What if it is: > blah = foo.bar.whatchamacallit() > > where bar is some oddball object of your own imagining. > > Have you veteran Rubyists come up with a nice way to write stuff like > this that keeps the nice clean flow of Ruby's chaining in place, but > solves the problems with potentially nil intermediate results? > > thanks, > jp > > -- > Posted viahttp://www.ruby-forum.com/. It feels like it could be shortened, perhaps the :type is unnecessary, but I was thinking of something like this for my DataMapper to ease the pain of using object graphs in simple tabular reporting views... class Object def default(type) self || type.new end end class Person attr_accessor :name def initialize(name) @name = name end end people = [ Person.new('Bob'), nil ] for person in people puts "Hello " + person.default(Person).name end Which isn't _too_ ugly I think. On the other hand you could end up with something like this: puts @photo.default(Article).article.default(Category).category.name Instead of: puts @photo.article.category.name But that's obviously more than a bit contrived. Any ideas would be welcome though...