в чем разница между .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
. Немного ошеломляет, но все, что происходит, это метод со странным именем .