Существует ли эквивалентная нулевая профилактика для цепных атрибутов groovy в ruby? - PullRequest
10 голосов
/ 10 января 2012

Groovy:

если есть my_object -> получить доступ к имени и использовать заглавные буквы

my_object?.name?.capitalize()

Что является эквивалентом для ruby, чтобы избежать доступа объекта nil к атрибутам с помощью этого средства?

Спасибо

Ответы [ 3 ]

9 голосов
/ 10 января 2012

Это работает в Rails:

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

Если вы хотите, чтобы он работал в Ruby, вы должны расширить Object следующим образом:

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

Источник

В Rails это реализовано так:

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
4 голосов
/ 10 января 2012

andand gem обеспечивает эту функцию.

my_object.andand.name.andand.capitalize()
0 голосов
/ 10 января 2012

Предполагая, что вы хотите избежать ошибки nil, если my_object равен nil. Попробуйте:

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

Ruby сначала выполнит проверку nil, а затем попытается получить доступ к атрибуту, если my_object не равен нулю.

Dave

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...