我经常发现自己这样做:
!(val).nil?
如果有像
这样的方法,我的代码会更漂亮val.exists?
有类似的东西吗?
答案 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
是所有类的父级)。