在Rails文档中,为Object#presence方法提供的示例是:
Object#presence
region = params[:state].presence || params[:country].presence || 'US'
但这不就等于:
region = params[:state] || params[:country] || 'US'
使用presence的目的是什么?
presence
6pp0gazn1#
重点是
''.presence # => nil
如果params[:state] == '':
params[:state] == ''
region = params[:state].presence || 'US' # => 'US' region = params[:state] || 'US' # => ''
更重要的是,它以类似的方式工作(也就是说,如果对象是'empty',则返回nil),对于每个响应empty?方法的对象,例如:
nil
empty?
[].presence # => nil
以下是文档,供参考:http://api.rubyonrails.org/classes/Object.html#method-i-presence
zmeyuzjn2#
使用#presence的真实的点在于它扩展了falsey值 * 的概念,以处理web和http场景。文件没有明确说明这个目的...而是简单地关注方法的API:“什么”,但不是“为什么”。Web和HTTP与普通编程不同,因为您从请求中获得的通常是空字符串而不是nil。然而,在普通Ruby中,空字符串是 truthy。这使得web开发人员编写了大量冗余的样板代码,就像Object.presence使用的文档一样,就像这里引用的其他人一样。对于用Rails编写Web应用程序的人来说,底线是我们现在可以(应该)使用标准Ruby短路的#present?和#presence,或者||:
#presence
Object.presence
#present?
||
# Check for a param like this @name = params[:name].presence || 'No name given'
这一行正确地处理了web服务器为我们打包到request参数中的所有内容。而这颗普通的Ruby却没有:
request
# DON'T DO THIS @name = params[:name] || 'No name given'
yhuiod9q3#
presence非常有用,如果对象不存在,则返回nil,如果对象存在,则返回对象本身。换句话说,你想要一个看起来像这样的代码:object.present? ? object : nil你可以简单地调用object.presence,而不是上面的那一行,这个方法会为你做这些工作。
object.present? ? object : nil
object.presence
gab6jxml4#
作为另一个例子,presence让我展示我最喜欢的FizzBuzz解决方案:
puts 1.upto(100).map { |n| "#{'Fizz' if n%3==0}#{'Buzz' if n%5==0}".presence || n }
jm2pwxwz5#
我只是以一种我觉得很整洁的有用的方式使用它。我的变量是一个字符串,如果它是空字符串,我希望它为nil,否则我希望它转换为整数。
x.presence.try(&:to_i) "".presence.try(&:to_i) # => nil "22".presence.try(&:to_i) # => 22
5条答案
按热度按时间6pp0gazn1#
重点是
如果
params[:state] == ''
:更重要的是,它以类似的方式工作(也就是说,如果对象是'empty',则返回
nil
),对于每个响应empty?
方法的对象,例如:以下是文档,供参考:
http://api.rubyonrails.org/classes/Object.html#method-i-presence
zmeyuzjn2#
使用
#presence
的真实的点在于它扩展了falsey值 * 的概念,以处理web和http场景。文件没有明确说明这个目的...而是简单地关注方法的API:“什么”,但不是“为什么”。Web和HTTP与普通编程不同,因为您从请求中获得的通常是空字符串而不是nil
。然而,在普通Ruby中,空字符串是 truthy。这使得web开发人员编写了大量冗余的样板代码,就像
Object.presence
使用的文档一样,就像这里引用的其他人一样。对于用Rails编写Web应用程序的人来说,底线是我们现在可以(应该)使用标准Ruby短路的
#present?
和#presence
,或者||
:这一行正确地处理了web服务器为我们打包到
request
参数中的所有内容。而这颗普通的Ruby却没有:yhuiod9q3#
presence
非常有用,如果对象不存在,则返回nil
,如果对象存在,则返回对象本身。换句话说,你想要一个看起来像这样的代码:object.present? ? object : nil
你可以简单地调用
object.presence
,而不是上面的那一行,这个方法会为你做这些工作。gab6jxml4#
作为另一个例子,
presence
让我展示我最喜欢的FizzBuzz解决方案:jm2pwxwz5#
我只是以一种我觉得很整洁的有用的方式使用它。我的变量是一个字符串,如果它是空字符串,我希望它为nil,否则我希望它转换为整数。