object.presence有什么意义?

时间:2013-10-28 14:32:04

标签: ruby-on-rails

在Rails文档中,object.presence方法的the example provided为:

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

但这不等于:

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

使用presence有什么意义?

5 个答案:

答案 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'