Как реализовать «шаблон нулевого объекта», совместимый с «безопасной навигацией»? - PullRequest
0 голосов
/ 08 мая 2020

Мне нравится шаблон Null Object, например

class NullAddress
  def details; "No address entered yet";  end

  def blank?;   true; end
  def present?; false; end
  def nil?;     true; end
end

address = NullAddress.new

Но я понятия не имею (и ничего не нашел), как сделать это &. -совместимым:

address&.city
#=> NoMethodError: undefined method `city' for #<NullAddress:0x000055d3bbdeb7e8>

К сожалению Безопасная навигация широко используется в нашем приложении, поэтому я должен иметь это в виду при реализации шаблона Null Object.

Я пробовал расширять NullObject. Но это вообще не вызывает NoMethodError:

address.foo_is_no_method
#=> nil

Есть подсказки?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Оператор безопасной навигации является частью грамматики ruby. Это не оператор, который вы можете реализовать как метод в своем коде.

Если вы все еще хотите избавиться от NoMethodError, вы можете использовать

def method_missing(m, *args, &block)
  nil
end

, но это всего лишь взлом.

Могут быть другие последствия этой реализации, когда вы вызываете другие методы, которые вы ожидаете от темы в классе адресов, но из-за method_missing вы всегда получаете nil.

как address.location будет return nil который должен выбросить NoMethodError

0 голосов
/ 08 мая 2020

Оператор безопасной навигации &. - Оператор безопасной навигации, представленный в Ruby 2.3.0. Он в основном возвращает nil, если вызываемый - nil, вместо того, чтобы вызывать исключение undefined method called for Nil class. например:

    a = 1
    a.next
    # => 2
    a&.next
    # => 2
    a = nil
    a.next
    # => NoMethodError (undefined method `next' for nil:NilClass)
    a&.next
    # => nil ## No exception, returns nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...