响应方法并且在Ruby中不是空检查?

时间:2013-12-30 21:43:04

标签: ruby

我正在使用大型代码库,我会看到以下代码:

if foo.respond_to?(:bar)
  unless foo.bar.nil?
    # do stuff
  end
end

有没有办法在一行中做到这一点?

[最终答案]

if foo.respond_to?(:bar) and not foo.bar.nil?
  # do stuff
end

2 个答案:

答案 0 :(得分:1)

一行还是一个方法调用? unless只是一个逻辑上倒置的if,所以你可以把它放在这样的一行......

if foo.respond_to?(:bar) && !foo.bar.nil?
  # do stuff
end

否则,你可以在foo上创建一个方法,或者在一次调用中创建一些帮助器。

答案 1 :(得分:1)

如果您使用的是ActiveSupport> = 4.0,如果对象没有响应该方法,则Object#try将返回nil。如Rails 4 release notes中所述。

  

如果接收对象没有实现该方法,

Object#try现在将返回nil而不是引发NoMethodError,但是仍然可以通过使用新的Object#try获得旧行为。

所以,你可以用unless foo.try(:bar)做你想做的事。如果您没有使用ActiveSupport,在这种情况下可能没用,但是找到此页面的其他人可能有兴趣知道这一点。