Ruby: два способа использования try в Hash - PullRequest
3 голосов
/ 16 апреля 2019

Я хочу извлечь значение, используя try в Ruby.

Я обнаружил, что есть два способа сделать это, и поэкспериментировал с ним в irb.

>> hash = { a: 1, b: 2 }
=> {:a=>1, :b=>2}
>> hash.try(:a)
=> nil
>> hash.try(:[], :a)
=> 1

У меня два вопроса:

  1. В чем разница между hash.try(:[], :a) и hash.try(:a)?Я искал вокруг и обнаружил, что люди используют оба пути.
  2. Я видел много мест, использующих hash.try (: a) для получения значений, но почему мое испытание возвращает ноль?

1 Ответ

4 голосов
/ 16 апреля 2019
hash.try(:[], :a)
# 1

Пытается вызвать открытый метод [] для hash, передав в качестве аргумента :a []. Поскольку :a является существующим ключом в хэше, он возвращает его значение.

hash.try(:a)
# nil

Пытается вызвать публичный метод :a для hash. Как hash, так как получатель не отвечает на :a, тогда он возвращает nil.

В качестве пояснения аргументы для try являются в первую очередь методом, вызываемым на приемнике, а все остальные аргументы являются аргументами для вызываемого метода.


Если ваш хеш может ответить на метод :a, hash.try(:a) вернет значение этого метода, вызываемого hash:

# Just for example purposes
class Hash; def a; :a_monkey_patched_value_for_a; end

hash.try(:a)
# :a_monkey_patched_value_for_a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...