483eacd3be075a4f342003c873796c03

Is there a better way to do this? I would love syntax like obj?property?property but I don't think there would be any way to pull that off without modification to the Ruby language itself.

# Usage:
#   nil.get :blake # => nil
#   some_obj.get :name, :length # => The value of some_obj.name.length or nil 
class Object
  def get(*properties)
    object = self
    properties.each do |property|
      if object.respond_to?(property)
        object = object.send(property)
      else
        return nil
      end
    end
    object
  end
end

Refactorings

No refactoring yet !

0c39b828636367fc6e22b7be8c803c74

David Calavera

January 30, 2011, January 30, 2011 19:38, permalink

No rating. Login to rate!
class Object
  def get(*properties)
    return nil if self.nil?

    object = self
    properties.inject(object) do |object, property|
      object and object.send(property)
    end
  end
end
A8d3f35baafdaea851914b17dae9e1fc

Adam

January 31, 2011, January 31, 2011 03:04, permalink

No rating. Login to rate!
class Object
  def get(*properties)
    properties.inject(self) do |object,property|
      object.respond_to?(property) ? object.send(property) : nil
    end
  end
end
D41d8cd98f00b204e9800998ecf8427e

Marc

January 31, 2011, January 31, 2011 08:45, permalink

No rating. Login to rate!
class Object
  def get(*properties)
    properties.inject(self) do |object,property|
      object.try property
    end
  end
end
A302e7dd208f335dc67761a6db911561

emmanuel delgado

February 2, 2011, February 02, 2011 01:03, permalink

No rating. Login to rate!
class Object
  def get(*properties)
    object, param = properties.count == 1 ? [self, properties.first] : [properties.first, properties.last]
    object.respond_to?(param) ? object.send(param) : nil 
  end 
end

o = Object.new
puts o.get(:class)

o = "lalala"
puts (o.get :class, :methods)

Your refactoring





Format Copy from initial code

or Cancel