Как мне обработать условие в Ruby, когда проверка может привести к ошибке? - PullRequest
0 голосов
/ 22 февраля 2020

У меня такая ситуация:

# self refers to an instance of a Book class
self.author = instance_of_author_class                    #returns instance
self.author.name = instance_variable_in_author_instance   #returns string

# this is an instance method of the Book class:
def author_name
    self.author ? self.author.name : nil                  #returns string or nil
end

Этот код работает нормально, так как сначала проверяется, есть ли набор author, затем возвращает его имя или nil, если нет Автор задан.

Однако я бы хотел сделать это с немного меньшим количеством кода, поскольку я часто нахожусь в ситуации, когда я хочу " просто вернуть вещь, если оно существует". Я не люблю проверять вещь перед тем, как просто вернуть ее. Выражение || OR выглядит так, как будто оно будет работать идеально.

def author_name
    self.author.name || nil
end

Это будет прекрасно работать, если self.author.name каким-то образом предварительно инициализировать как false или nil, но, к сожалению, если author не установлен на какой-либо действительный экземпляр (и этот действительный экземпляр также имеет определенный метод name), тогда я получу:

NoMethodError:
       undefined method `name' for nil:NilClass

И, к сожалению, ruby, похоже, не обрабатывать ошибки как false, выполнение останавливается.

Есть идеи, как мне достичь этой цели?

(добавлен тег javascript stackoverflow, потому что я бы тоже приветствовал javascript решения!)

1 Ответ

4 голосов
/ 22 февраля 2020

Вы можете просто использовать безопасный оператор навигации , который был введен в Ruby в 2.3:

def author_name
  author&.name
end

Обратите внимание, что self не требуется в вашем примере.

Или когда вы используете Ruby на Rails, вы можете использовать delegate:

delegate :name, to: :author, prefix: true, allow_nil: true
...