我经常发现自己正在编写Ruby代码,在那里我检查是否存在值,然后在存在的情况下使用该值执行某些操作。 E.g。
if some_object.some_attribute.present?
call_something(some_object.some_attribute)
end
我认为如果可以写成
那就太酷了some_object.some_attribute.presence { |val| call_something(val) }
=> the return value of call_something
任何人都知道Ruby中是否有这样的功能,或者是否支持activesupport?
我为此功能打开了pull request。
答案 0 :(得分:12)
如果在没有参数的情况下调用
try
,则会将接收器生成给定块,除非它是nil
:
'foo'.presence.try(&:upcase)
#=> "FOO"
' '.presence.try(&:upcase)
#=> nil
nil.presence.try(&:upcase)
#=> nil
答案 1 :(得分:2)
你可以尝试
do_thing(object.attribute) if object.attribute
这通常很好,除非该属性是布尔值。在这种情况下,如果值为false,则不会调用。
如果您的属性可能为false,请改用.nil?
。
do_thing(object.attribute) unless object.attribute.nil?
答案 2 :(得分:0)
虽然没有开箱即用的功能,但可以这样做:
some_object.some_attribute.tap do |attr|
attr.present? && call_smth(attr)
end
另一方面,Rails提供了很多monkeypatches,可以在这个马戏团中添加一个:
class Object
def presense_with_rails
raise 'Block required' unless block_given?
yield self if self.present? # requires rails
end
def presense_without_rails
raise 'Block required' unless block_given?
skip = case self
when NilClass, FalseClass then true
when String, Array then empty?
else false
end
yield self unless skip
end
end