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
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)
presence当您想nil在对象不存在时返回,而对象存在时返回对象本身时,这非常有用。换句话说,您需要一个如下所示的代码:
object.present? object : nil
您可以简单地调用object.presence而不是上面的行,该方法将为您完成工作。
再举一个例子,presence让我展示我最喜欢的FizzBuzz解决方案:
puts 1.upto(100).map { |n| "#{'Fizz' if n%3==0}#{'Buzz' if n%5==0}".presence || n }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12963 次 |
| 最近记录: |