我正在使用大型代码库,我会看到以下代码:
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
答案 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,在这种情况下可能没用,但是找到此页面的其他人可能有兴趣知道这一点。