在 Ruby on Rails 中,以下各项之间是否存在区别:
if obj
# ...
end
Run Code Online (Sandbox Code Playgroud)
和:
if obj.present?
# ...
end
Run Code Online (Sandbox Code Playgroud)
看起来他们做同样的事情并且不使用.present?将有助于保持代码行更短并且可能更干净。我知道这.present?是相反的,blank?但在尝试确定对象是否“真实”时,我们是否应该始终使用它?
是否存在某种性能差异?
该#present?方法做得更多,因为如果字符串是真实但空字符串(即""),它也会返回 false
这很有用,因为您的表单可能返回空字符串而不是nils。
您还可以使用#presencewhich 是一种有用的方法,仅当值是#present?
name = params[:name].presence || 'ardavis'
Run Code Online (Sandbox Code Playgroud)
如果params[:name]是空字符串并且您没有使用,则上述内容将不起作用#presence
他们根本不做同样的事情。
在 Ruby 中,除了nil和之外的所有内容false都是真实的。与其他流行动态语言中的类型转换策略相比,这是非常明智的。
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
Run Code Online (Sandbox Code Playgroud)
present?是presenceActiveSupport 的一部分,可用于测试 nil 和 false,但实际上在处理用户输入时更有用:
irb(main):010:0> "".present?
=> false
irb(main):011:0> [].present?
=> false
irb(main):012:0> {}.present?
=> false
Run Code Online (Sandbox Code Playgroud)
present?并且presence被那些懒得先学习 Ruby 的 Rails 初学者广泛过度使用。只需使用隐式真值检查 ( if foo) 或者foo.nil?如果您只想检查是否发送了参数或是否设置了变量。
虽然.present?可以在 ActiveRecord 集合上使用,但还有更惯用的正确选择,例如any?和none?。
| 归档时间: |
|
| 查看次数: |
2415 次 |
| 最近记录: |