是否有红宝石功能!(val).nil ??

时间:2010-01-19 20:26:40

标签: ruby

我经常发现自己这样做:

!(val).nil?

如果有像

这样的方法,我的代码会更漂亮
val.exists?

有类似的东西吗?

5 个答案:

答案 0 :(得分:11)

您可以使用unless语句,例如

do_something unless val.nil?

这可能非常接近于说出它的理想方式:如果你有一个non_nil?方法,你会有一个否定的陈述而不是像这样的肯定陈述。

答案 1 :(得分:5)

if !val.nil?
  # do something
end

# is equivalent to

if val
  # do something
end

如果您使用的是Rails,ActiveSupport会提供名为Object#blank的two Object extensions吗?和对象#present?。

if !address.nil? && !address.empty?
# becomes
if !address.blank?
# which becomes
if address.present?

答案 2 :(得分:2)

值得注意的是!val.nil?是一种代码气味,表明可能有更好的方法来做你想做的事情;也许代码依赖于一个数据结构,可以用可以更好地处理边缘情况的东西代替。

以下是.nil?单向使用方式不佳的示例:

例如:

blah = {}
[:a,:b,:c,:a].each do |l|
     if blah[l].nil?
         blah[l] = 0
     else
         blah[l] += 1
     end
end
blah #=> {:a => 2, :b => 1, :c =>1}

可能会被重写为

blah = Hash.new(0)
[:a,:b,:c,:a].each{|i| blah[i] += 1} #or with inject.

||=运算符是另一个需要研究的领域。


<强>数据被编辑: 做一些价值可能为零的事情的常用习惯是使用&amp;&amp;运算符,因为nil是假的,所以不是

if !val.nil?
   val.do_something
end

只需编写

即可
val && val.do_something # =>nil if val is nil, val.do_something's value otherwise

这需要在布尔表达式中处理nil的方式同样多,如下面的mckeed(x if y)条件示例所需,因此它不能真正帮助代码更好地读取。

答案 3 :(得分:1)

!!值

答案 4 :(得分:0)

module Nonnil
  def non_nil?
    !(self.nil?)
  end
end

class Someclass
  include Nonnil
  extend Nonnil
end

这会将成员.non_nil?添加到类Someclass,定义为.nil?的反转。将此模块混合到'val'(在您的示例中)所属的类中,您将拥有一个方便的快捷方式。将其混合到类Object中,它将适用于每个类(因为Object是所有类的父级)。

相关问题