2012-01-10 11 views

Respuesta

9

Esto funciona en Rails:

my_object.try(:name).try(:capitalize) 

Si quieres que funcione en Ruby tiene que extender Object así:

class Object 
    ## 
    # @person ? @person.name : nil 
    # vs 
    # @person.try(:name) 
    def try(method) 
    send method if respond_to? method 
    end 
end 

Source

En Rails se implementa así:

class Object 
    def try(*a, &b) 
    if a.empty? && block_given? 
     yield self 
    else 
     __send__(*a, &b) 
    end 
    end 
end 

class NilClass 
    def try(*args) 
    nil 
    end 
end 
+1

notablemente, esto es diferente al 'Object # try' de' ActiveSupport'. La implementación de 'ActiveSupport' es básicamente' enviar', excepto 'nil.try' siempre devuelve' nil' –

+0

Gracias @MatthewRudy. Esto es mejor ya que también acepta bloques y parámetros. – Mischa

-3

que significan Suponiendo que desea evitar un error de nil si mi_objeto es nula. Proveedores:

my_object?.name?.capitalize() unless my_object.nil? 

Rubí hará el nulo comprobar primero y sólo entonces tratar de acceder al atributo si mi_objeto no es un valor nulo.

de Dave

+1

Creo que el punto de la pregunta es cómo hacer que funcione sin 'menos' o' si'. – Mischa

+1

¿Hay un '? .'? –

+0

Obtengo el método 'no definido 'my_object?'' Si 'my_object' está definido. –

4

El andand gem proporciona esta funcionalidad.

my_object.andand.name.andand.capitalize() 
+0

con la misma idea (y autor), tal vez Ick: http://ick.rubyforge.org/ – tokland

Cuestiones relacionadas