Подтвердить что ты не робот

В чем смысл объекта. Признание?

В документах Rails приведенный пример для метода object.presence:

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

Но это не просто эквивалентно:

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

В чем смысл использования presence?

4b9b3361

Ответ 1

Здесь точка:

''.presence
# => nil

поэтому, если params[:state] == '':

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

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

[].presence
# => nil

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

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

Ответ 2

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

 x.presence.try(&:to_i)

 "".presence.try(&:to_i) # => nil
 "22".presence.try(&:to_i) # => 22

Ответ 3

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

object.present? object: nil

Вместо строки выше вы можете просто вызвать object.presence и метод сделает всю работу за вас.

Ответ 4

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

puts 1.upto(100).map { |n| "#{'Fizz' if n%3==0}#{'Buzz' if n%5==0}".presence || n }

Ответ 5

#presence использования #presence том, что он расширяет понятие значений Falsey для обработки сценариев web и http. Документы не проясняют эту цель... вместо этого просто сосредотачиваются на API метода: что, но не почему. Web и HTTP отличается от обычного программирования, потому что часто пустая строка - это то, что вы получаете вместо nil из запроса.

Однако в простом Ruby пустая строка является правдивой. Это заставляет веб-разработчиков писать много лишнего стандартного кода, такого как документы для Object.presence используемые в качестве примера, как цитировали другие.

В #present? для людей, пишущих веб-приложения на Rails, мы можем (должны) теперь использовать #present? и #presence со стандартным замыканием в Ruby или, || :

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

Эта строка правильно обрабатывает все, что веб-сервер упаковывает в параметры request для нас. Пока этот старый добрый рубин не

# DON'T DO THIS
@name = params[:name] || 'No name given'