ruby Object#在Rails中的作用是什么?

qacovj5a  于 12个月前  发布在  Ruby
关注(0)|答案(5)|浏览(84)

在Rails文档中,为Object#presence方法提供的示例是:

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

但这不就等于:

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

使用presence的目的是什么?

6pp0gazn

6pp0gazn1#

重点是

''.presence
# => nil

如果params[:state] == ''

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

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

[].presence
# => nil

以下是文档,供参考:
http://api.rubyonrails.org/classes/Object.html#method-i-presence

zmeyuzjn

zmeyuzjn2#

使用#presence的真实的点在于它扩展了falsey值 * 的概念,以处理web和http场景。文件没有明确说明这个目的...而是简单地关注方法的API:“什么”,但不是“为什么”。Web和HTTP与普通编程不同,因为您从请求中获得的通常是空字符串而不是nil
然而,在普通Ruby中,空字符串是 truthy。这使得web开发人员编写了大量冗余的样板代码,就像Object.presence使用的文档一样,就像这里引用的其他人一样。
对于用Rails编写Web应用程序的人来说,底线是我们现在可以(应该)使用标准Ruby短路的#present?#presence,或者||

# Check for a param like this
@name = params[:name].presence || 'No name given'

这一行正确地处理了web服务器为我们打包到request参数中的所有内容。而这颗普通的Ruby却没有:

# DON'T DO THIS
@name = params[:name] || 'No name given'
yhuiod9q

yhuiod9q3#

presence非常有用,如果对象不存在,则返回nil,如果对象存在,则返回对象本身。换句话说,你想要一个看起来像这样的代码:
object.present? ? object : nil
你可以简单地调用object.presence,而不是上面的那一行,这个方法会为你做这些工作。

  • 编辑:* 固定问号
gab6jxml

gab6jxml4#

作为另一个例子,presence让我展示我最喜欢的FizzBuzz解决方案:

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

jm2pwxwz5#

我只是以一种我觉得很整洁的有用的方式使用它。我的变量是一个字符串,如果它是空字符串,我希望它为nil,否则我希望它转换为整数。

x.presence.try(&:to_i)

 "".presence.try(&:to_i) # => nil
 "22".presence.try(&:to_i) # => 22

相关问题