我正在寻找“优雅”的方法来检查给定的对象是否为零,并且它的属性为零或空。目前我有这个检查
response = foo.call() # some service call, no http code given :)
raise StandardError, "Response is not valid" if response.nil? || response['data'].nil? || reponse['data'].emtpy?
有没有更优雅的方法来做到这一点,并避免三重或检查?如果有人建议的那样,换入begin/catch
并不是一种优雅的方式。
答案 0 :(得分:4)
这个怎么样?
data = response.try(:[], 'data')
raise Exception, "Response is not valid" if data.nil? || data.empty?
正如@ksol在评论中正确提到的那样,try
助手来自ActiveSupport。但重新实施并不困难。
class Object
def try method, *args
if respond_to? method
send method, *args
else
nil
end
end
end
class Foo
def hello name
"hello #{name}"
end
end
f = Foo.new
f.try(:bar) # => nil
f.try(:hello, 'world') # => "hello world"
nil.try(:wat) # => nil
如果您不想拖动整个activesupport并且不想编写已编写的代码,那么这里是Object#andand。
data = response.andand['data']
raise Exception, "Response is not valid" if data.nil? || data.empty?
答案 1 :(得分:3)
如果这是在Rails中,你可以这样做:
raise "Response is not valid" unless response && response['data'].present?
在Rails之外,我不确定你能比原来的线做得更好。另一种变化可能是:
raise "Response is not valid" unless response && response['data'] && !response['data'].empty?
显然,最后一行与你的差别不大。
答案 2 :(得分:2)
unless response && response['data'] && !response['data'].empty?