我正在寻找一种更惯用的方法来过滤数组中的nil或empty元素。
我有很多方法的形式:
def joined
[some_method, some_other_method].compact.reject(&:empty?).join(' - ')
end
这将获取some_method
和some_other_method
的结果,并仅返回既非空(compact
本质上等同于reject(&:nil?)
)又非空的结果。
有没有什么在阵列或Escort得到同样的东西在一个镜头?
7条答案
按热度按时间ikfrs5lh1#
在Rails中,你可以做
reject(&:blank?)
,或者等价的select(&:present?)
。如果这不是一个Rails应用程序,而你经常这样做,我建议你在
String
或任何你正在过滤的东西上定义你自己的助手。niknxzdl2#
下面的代码应该可以做到这一点:
它可以很容易地用来扩展数组类:
然后你就可以这样做:
6jjcrrmo3#
蒙纳契接受了吗?:)
你可以试试这个:
它可以处理任何响应
size
的对象,而不仅仅是那些响应empty?
的对象vojdkbi04#
也许我们只需要一个简单的扩展NilClass?
fsi0uk1n5#
@ transs喜欢我的+1,但经过进一步的审议,我得出了以下结论。
如果我们假设所有东西都是
Object
,那么我们实际上需要的只是class Object
的补丁满足我的要求:
你的呢我们还需要什么吗?请说出你的疑虑或通过投票来表示沉默的同意,以帮助激励上游的语言变化。
乔伊!
ssm49v7z6#
我认为你不需要使用
reject
方法。使用Array的select
方法。或者更好:
有关更多**Idiomatic way to write Ruby code**,您应该阅读此article
vx6bjr1n7#
ActiveSupport
,Rails的一部分,有这个方法,blank_empty_nil_filters
gem也有:is_blank?
和is_empty?
。两者之间有区别。有些用例容忍空白(空白),有些则不然。
也许最重要的是,
blank_empty_nil_filters
已经内置了从Hash和Array值中过滤出这类值的功能。示例如下:参阅自述
ActiveSupport
是一个更大、更全面的gem,它使用Regexp.match
来确定空白,而blank_empty_nil_filters
gem代码使用非破坏性的条带,它对非UTF8字符串错误条件更快、更不敏感。