在Rails文档中,object.presence
方法的the example provided为:
region = params[:state].presence || params[:country].presence || 'US'
但这不等于:
region = params[:state] || params[:country] || 'US'
使用presence
有什么意义?
答案 0 :(得分:79)
以下是重点:
''.presence
# => nil
所以如果params[:state] == ''
:
region = params[:state].presence || 'US'
# => 'US'
region = params[:state] || 'US'
# => ''
更重要的是,它在每个响应nil
方法的对象上以类似的方式工作(即,如果object为“empty”,则返回empty?
,例如:
[].presence
# => nil
以下是文档,供参考:
http://api.rubyonrails.org/classes/Object.html#method-i-presence
答案 1 :(得分:2)
我只是以一种有用的方式使用它,我发现它很整洁。我的变量是一个字符串,如果它是我想要的空字符串,否则我希望它转换为整数。
x.presence.try(&:to_i)
"".presence.try(&:to_i) # => nil
"22".presence.try(&:to_i) # => 22
答案 2 :(得分:2)
再举一个例子,presence
让我介绍我最喜欢的FizzBuzz解决方案:
puts 1.upto(100).map { |n| "#{'Fizz' if n%3==0}#{'Buzz' if n%5==0}".presence || n }
答案 3 :(得分:1)
presence
(如果不存在对象)和对象本身(如果存在),则 nil
很有用。换句话说,您需要一个看起来像这样的代码:
object.present? object : nil
您可以简单地调用object.presence
而不是上面的行,该方法将为您完成工作。
答案 4 :(得分:0)
使用#presence
的真正意义在于,它扩展 假值的概念以处理Web和http方案。文档并没有明确说明这个目的……而是仅仅关注方法的API:什么,而不是为什么。 Web和HTTP与普通编程不同,因为通常是从您那里得到一个空白字符串,而不是从请求中得到nil
。
但是在普通的Ruby中,一个空字符串是 truthy 。这使Web开发人员编写了很多冗余的样板代码,例如Object.presence
的docs用作示例,如此处其他人所引用的。
在Rails中编写Web应用程序的人们的底线是,我们现在(应该)可以将#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'