在Ruby on Rails中,两者之间有区别吗?
if obj
# ...
end
和:
if obj.present?
# ...
end
似乎他们做了同样的事情,并且不使用.present?
可以帮助使代码行更短并且可能更干净。我了解.present?
与blank?
相反,但是在尝试确定某个对象是否“真实”时我们应该一直使用它吗?
是否存在某种性能差异?
答案 0 :(得分:2)
#present?
方法的作用还在于,如果字符串是真实但为空的字符串(即""
),它还会返回false
这很有用,因为您的表单可能返回空字符串而不是nil
。
您还可以使用#presence
,这是仅当值是#present?
时才返回值的有用方法
name = params[:name].presence || 'ardavis'
如果params[:name]
是一个空字符串,并且您未使用#presence
答案 1 :(得分:1)
他们根本不做相同的事情。
在Ruby中,除了nil
和false
以外的所有内容都是真实的。与其他流行的动态语言中的类型转换schenigans相比,这真是理智。
irb(main):003:0> !!""
(irb):3: warning: string literal in condition
=> true
irb(main):004:0> !!0
=> true
irb(main):005:0> !![]
=> true
irb(main):006:0> !!{}
=> true
irb(main):007:0> !!Object.new
=> true
irb(main):008:0> !!nil
=> false
irb(main):009:0> !!false
=> false
present?
和presence
是ActiveSupport的一部分,可用于测试nil和false,但实际上在处理用户输入时更有用:
irb(main):010:0> "".present?
=> false
irb(main):011:0> [].present?
=> false
irb(main):012:0> {}.present?
=> false
Rails初学者广泛使用它们,尽管他们不愿意先学习Ruby。如果只想检查是否发送了自变量或是否设置了变量,只需使用隐式真值检查(if foo
)或foo.nil?
。
虽然.present?
可以用于ActiveRecord集合,但是还有很多习惯用法上正确的选择,例如any?
和none?
。
答案 2 :(得分:0)
如果您正在使用字符串,则仅检查属性或对象是否存在将返回true,但是present方法将返回false。
以下是一些示例:
# Double negation return the boolean value
!!""
=> true
"".present?
=> false
" ".present?
=> false
[].present?
=> false
nil.present?
=> false
true.present?
=> true
false.present?
=> false
{}.present?
=> false
person = {:firstName => "John", :lastName => "Doe"}
person.present?
=> true
5.present?
=> true