Какой смысл объекта.присутствие?

В рельсах документы, Пример для объекта`.метод присутствия-это:

region = params[:state].presence || params[:country].presence || 'US'

Но разве'т, что просто эквивалентно:

region = params[:state] || params[:country] || 'US'

В чем смысл использования "присутствия"?

Решение

Здесь'ы точке:

''.presence
# => nil

так что если слово params[:государство] == ''`:

region = params[:state].presence || 'US'
# => 'US'
region = params[:state] || 'US'
# => ''

Что's больше, он работает в аналогичным образом (то есть, возвращает "ноль", если объект 'пустой') на каждый объект, который реагирует на пустой? способ, например:

[].presence
# => nil

Здесь'ы документации, для справки:

http://api.rubyonrails.org/classes/Object.html#method-i-presence

Комментарии (9)

Я просто использовал его в полезный способ, который я нашел аккуратно. Мой переменной является строка, если она'с пустой строкой я хочу нулю, в противном случае я хочу его преобразовать в целое число.

 x.presence.try(&:to_i)

 "".presence.try(&:to_i) # => nil
 "22".presence.try(&:to_i) # => 22
Комментарии (3)

присутствие - это очень полезно, когда вы хотите вернуть "ноль", если объект не существует и самого объекта, если объект присутствует. Другими словами, вы хотите код, который выглядит так:

объект.подарок? объект : шь

Вместо строки выше, вы можете просто назвать объект.наличие и способ будет делать работу за вас.

Комментарии (0)

В качестве другого примера, "присутствия" позволяет мне представить моих любимых FizzBuzz решение:

puts 1.upto(100).map { |n| "#{'Fizz' if n%3==0}#{'Buzz' if n%5==0}".presence || n }
Комментарии (0)

В реальный момент, используя `#присутствие заключается в том, что он расширяет понятие falsey values для обработки веб-сценариев и протокола HTTP. Документы Дон'т принять эту цель ясно ... вместо того чтобы просто упором на метод'ы по API: в what, но не зачем. Веб-и HTTP отличается от нормального программирования, потому что пустая строка-это часто то, что вы получаете вместо "ноль" с просьбой.

В обычный Рубин, однако пустая строка truthy. Это делает веб-разработчики пишут много лишнего шаблонный код, как документы на объект.присутствие` использует в качестве примера, как другие здесь процитировали.

В нижней строке для написания веб-приложений в Rails, что мы можем (должны) теперь используйте #подарить? " и " присутствие#со стандартным Ruby короткое замыкание или||`:

# Check for a param like this
@name = params[:name].presence || 'No name given'

Эту линию правильно обрабатывает все веб-сервера пакеты в параметры просьбе `для нас. Хотя это старый добрый Руби не:

# DON'T DO THIS
@name = params[:name] || 'No name given'
Комментарии (0)