1

我正在寻找“优雅”的方法来检查给定对象是否为 nil 并且它的属性是 nil 或空。目前我有这张支票

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如果有人建议,包裹并不是优雅的方式。

4

3 回答 3

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

备择方案

这是Object#andand如果您不想拖拽整个 activesupport 并且不想编写已经编写的代码。

data = response.andand['data']
raise Exception, "Response is not valid" if data.nil? || data.empty?
于 2012-11-13T14:08:00.387 回答
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?

显然,最后一行与您的没有太大不同。

于 2012-11-13T14:14:29.660 回答
2
unless response && response['data'] && !response['data'].empty?
于 2012-11-13T14:07:16.527 回答