如果有价值,就做点什么

时间:2015-09-02 15:17:52

标签: ruby-on-rails ruby activesupport

我经常发现自己正在编写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

3 个答案:

答案 0 :(得分:12)

您可以结合使用presencetry

  

如果在没有参数的情况下调用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