object.presence有什么意义?

ben*_*ben 54 ruby ruby-on-rails

在Rails文档中,为该方法提供的示例object.presence是:

region = params[:state].presence || params[:country].presence || 'US'
Run Code Online (Sandbox Code Playgroud)

但这不等于:

region = params[:state] || params[:country] || 'US'
Run Code Online (Sandbox Code Playgroud)

有什么用presence

Mar*_*pka 89

这就是重点:

''.presence
# => nil
Run Code Online (Sandbox Code Playgroud)

如果params[:state] == '':

region = params[:state].presence || 'US'
# => 'US'
region = params[:state] || 'US'
# => ''
Run Code Online (Sandbox Code Playgroud)

更重要的是,它在nil响应empty?方法的每个对象上以类似的方式工作(即,如果对象为'empty' 则返回),例如:

[].presence
# => nil
Run Code Online (Sandbox Code Playgroud)

这是文档,供参考:

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

  • ;)以一个例子来回答这个答案! (2认同)

Dog*_*her 24

使用的真正意义#presence在于它扩展了false 值的概念来处理 web 和 http 场景。文档并没有明确说明这一目的……而是简单地关注该方法的 API:“是什么”而不是“为什么”。Web 和 HTTP 与普通编程不同,因为您通常会得到一个空字符串,而不是nil从请求中得到的字符串。

然而,在普通 Ruby 中,空字符串是true。这使得 Web 开发人员编写了大量冗余的样板代码,例如Object.presence用作示例的文档,正如其他人引用的那样。

对于在 Rails 中编写 Web 应用程序的人来说,底线是我们现在可以(应该)使用#present?and#presence和标准 Ruby 短路,或者||

# Check for a param like this
@name = params[:name].presence || 'No name given'
Run Code Online (Sandbox Code Playgroud)

该行正确地处理了 Web 服务器request为我们打包到参数中的所有内容。虽然这个普通的老红宝石不:

# DON'T DO THIS
@name = params[:name] || 'No name given'
Run Code Online (Sandbox Code Playgroud)


rad*_*lov 8

presence当您想nil在对象不存在时返回,而对象存在时返回对象本身时,这非常有用。换句话说,您需要一个如下所示的代码:

object.present? object : nil

您可以简单地调用object.presence而不是上面的行,该方法将为您完成工作。


Dan*_*ohn 5

再举一个例子,presence让我展示我最喜欢的FizzBu​​zz解决方案:

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