Понимание переменных вызова в Ruby - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь понять, что здесь происходит в этом небольшом фрагменте, но я не очень хорошо разбираюсь в Ruby. В конечном счете, я пытаюсь понять, в чем разница между .path и [: path]?

if(hit.props && hit.props.path)
      original_path = hit.props[:path]

Я понимаю часть выражения if. Проверьте, есть ли у попадания реквизит, и проверяет, есть ли у него путь в реквизите. Я просто запутался в том, что [: path] пытается достичь.

1 Ответ

3 голосов
/ 09 октября 2019

в чем разница между .path и [: path]

.path - это вызов метода. :path создает символ .


hit.props.path вызывает метод props объекта hit. Затем вызывает .path на все, что возвращается из этого. Это эквивалентно:

tmp = hit.props
tmp.path

hit.props[:path] снова вызывает метод props объекта hit. Затем извлекает значение из этого (вероятно, Hash ) ключа :path. :path - это символ, который похож на разделяемую строку только для чтения. Они часто используются в качестве хэш-ключей, чтобы сэкономить немного памяти и сделать вещи более аккуратными.

Это эквивалентно:

tmp = hit.props
val = tmp[:path]

Хотя я сказал, что символы похожи на строки, они не строки. tmp[:path] и tmp["path"] не эквивалентны.


Ваш код проверяет наличие hit.props и hit.props.path перед попыткой hit.props[:path]. Это, вероятно, неправильно;hit.props.path не используется.

Возможно, вы захотите проверить только hit.props, прежде чем пытаться использовать его как хэш.

if hit.props
  original_path = hit.props[:path]

Это можно еще больше уменьшить с помощью Безопасный оператор навигации &. представлен в Ruby 2.3.

original_path = hit.props&.[](:path)

Он работает так же, как обычный вызов метода, но если объект nil, вызов вернет nil, а неошибка. Если hit.props равно nil, то original_path будет nil. Это высушивает ваш код и устраняет избыточные вызовы методов;hit.props вызывается только один раз.

Обратите внимание, что мы используем тот факт, что props[:path] действительно является синтаксическим сахаром для вызова метода [] для объекта props. Немного ошеломляет, но все, что происходит, это метод со странным именем .

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