使用 compact_blank 来删除数组和哈希中的空字符串的方法

97 阅读1分钟

Active Support是一个支持(!)Rails其他部分的 "有用 "东西的库。它包括扩展Ruby基础类的方法,如Hash,StringInteger

即使是最有经验的Rails开发者也会不断在Active Support中找到有用的方法。而且在新版本的库中,有用的方法也在不断地被添加。

在解析参数时,或者在我们的代码接受复杂的输入时,我们经常需要清理Hashes和Arrays的值。Ruby提供了#compact 方法来删除数组中的nil 值,并且(从2.4开始)为Hash提供了同样的#compact 方法

除了nil ,我们还经常希望删除空字符串或其他 "空白 "对象。

而不是...

...手动循环浏览哈希的值来删除nil和空字符串。

[1, nil, “3”, “”, []].compact
#=> [1, “3”, “”, []]

[1, nil, “3”, “”, []].reject { |e| e.nil? || e&.empty? }
#=> [1, “3”]

[1, nil, “3”, “”, []].reject(&:blank?)
#=> [1, “3”]

{1 => 2, 2 => nil, “3” => “4”, 4 => “”, 5 => []}.compact
#=> {1 => 2, “3” => “4”, 4 => “”, 5 => []}

{1 => 2, 2 => nil, “3” => “4”, 4 => “”, 5 => []}.reject { |_, v| v.nil? || v&.empty? }
#=> {1 => 2, “3” => “4”}

{1 => 2, 2 => nil, “3” => “4”, 4 => “”, 5 => []}.reject { |_, v| v.blank? }
#=> {1 => 2, “3” => “4”}

使用...

...Active Support的#compact_blank 方法。

[1, nil, “3”, “”, []].compact_blank
#=> [1, “3”]

result = {1 => 2, 2 => nil, “3” => “4”, 4 => “”, 5 => []}.compact_blank
#=> {1 => 2, “3” => “4”}

#compact_blank方法是在Rails 6.1中添加的

为什么?

这是一个 "有用的Rails东西",一旦你习惯了它,就感觉它是Ruby的一部分。Active Support中的许多核心扩展都有这种共同的感觉。它比基于#reject-的版本好读得

为什么不呢?

有些人对框架侵入语言的基本概念感到不满。

然而,绝对有Ruby采用 "主动支持主义 "的情况。Hash#compact ,早在Rails的基础语言中就有了。