Is there an equivalent null prevention on chained attributes of groovy in ruby?

后端 未结 3 1263
礼貌的吻别
礼貌的吻别 2020-12-11 16:41

Groovy:

if there`s my_object -> access \'name\' and capitalize

my_object?.name?.capitalize()

What is the equivalent for ruby to avo

相关标签:
3条回答
  • 2020-12-11 16:58

    This works in Rails:

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

    If you want it to work in Ruby you have to extend Object like this:

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

    Source

    In Rails it's implemented like this:

    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
    
    0 讨论(0)
  • 2020-12-11 17:05

    The andand gem provides this functionality.

    my_object.andand.name.andand.capitalize()
    
    0 讨论(0)
  • 2020-12-11 17:09

    Assuming you mean you want to avoid a nil error if my_object is nil. Try :

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

    Ruby will do the nil check first and only then try to access the attribute if my_object isn't a null.

    Dave

    0 讨论(0)
提交回复
热议问题