# 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 !
David Calavera
January 30, 2011, January 30, 2011 19:38, permalink
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
Adam
January 31, 2011, January 31, 2011 03:04, permalink
class Object
def get(*properties)
properties.inject(self) do |object,property|
object.respond_to?(property) ? object.send(property) : nil
end
end
end
Marc
January 31, 2011, January 31, 2011 08:45, permalink
class Object
def get(*properties)
properties.inject(self) do |object,property|
object.try property
end
end
end
emmanuel delgado
February 2, 2011, February 02, 2011 01:03, permalink
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)
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.