nil-or-empty的惯用Ruby过滤器?

slmsl1lt  于 12个月前  发布在  Ruby
关注(0)|答案(7)|浏览(83)

我正在寻找一种更惯用的方法来过滤数组中的nil或empty元素。
我有很多方法的形式:

def joined
    [some_method, some_other_method].compact.reject(&:empty?).join(' - ')
end

这将获取some_methodsome_other_method的结果,并仅返回既非空(compact本质上等同于reject(&:nil?))又非空的结果。
有没有什么在阵列或Escort得到同样的东西在一个镜头?

ikfrs5lh

ikfrs5lh1#

在Rails中,你可以做reject(&:blank?),或者等价的select(&:present?)
如果这不是一个Rails应用程序,而你经常这样做,我建议你在String或任何你正在过滤的东西上定义你自己的助手。

class String
  alias :blank? :empty?
end

class NilClass
  def blank?
    true
  end
end
niknxzdl

niknxzdl2#

下面的代码应该可以做到这一点:

[some_method, some_other_method].reject{|i| i.nil? || i.empty? }

它可以很容易地用来扩展数组类:

class Array

  def purge
    self.reject{|i| i.nil? || i.empty? }
  end 

end

然后你就可以这样做:

[some_method, some_other_method].purge
6jjcrrmo

6jjcrrmo3#

蒙纳契接受了吗?:)
你可以试试这个:

class Array
  def tight
    self.compact.reject { |i| i.size.zero? }
  end
end

p [nil, 1, ''].tight
#=> [1]
p ['', nil, 2].tight
#=> [2]

它可以处理任何响应size的对象,而不仅仅是那些响应empty?的对象

vojdkbi0

vojdkbi04#

也许我们只需要一个简单的扩展NilClass?

class NilClass
  def empty?
    true
  end
end
fsi0uk1n

fsi0uk1n5#

@ transs喜欢我的+1,但经过进一步的审议,我得出了以下结论。
如果我们假设所有东西都是Object,那么我们实际上需要的只是class Object的补丁

class Object
    def empty?
        self == 0 or not self
    end
end

满足我的要求:

1.9.3 :001 > d=[Object.new, Class, {a:nil}, 'a', '', [], 1, 1.1, 0, 0.0, 0x0, 0E0, true, false, nil]
 => [#<Object:0x007fd56c086918>, Class, {:a=>nil}, "a", "", [], 1, 1.1, 0, 0.0, 0, 0.0, true, false, nil] 
1.9.3 :002 > d.reject(&:empty?)
 => [#<Object:0x007fd56c086918>, Class, {:a=>nil}, "a", 1, 1.1, true]

你的呢我们还需要什么吗?请说出你的疑虑或通过投票来表示沉默的同意,以帮助激励上游的语言变化。
乔伊!

ssm49v7z

ssm49v7z6#

我认为你不需要使用reject方法。使用Array的select方法。

def joined
  [some_method, some_other_method].select { |method| method.present? }
end

或者更好:

def joined
  [some_method, some_other_method].select(&:present?)
end

有关更多**Idiomatic way to write Ruby code**,您应该阅读此article

vx6bjr1n

vx6bjr1n7#

ActiveSupport,Rails的一部分,有这个方法,blank_empty_nil_filters gem也有:is_blank?is_empty?
两者之间有区别。有些用例容忍空白(空白),有些则不然。
也许最重要的是,blank_empty_nil_filters已经内置了从Hash和Array值中过滤出这类值的功能。示例如下:

array.no_nil_values
array.no_empty_values
array.no_blank_values

参阅自述
ActiveSupport是一个更大、更全面的gem,它使用Regexp.match来确定空白,而blank_empty_nil_filters gem代码使用非破坏性的条带,它对非UTF8字符串错误条件更快、更不敏感。

相关问题