用Ruby的.reject方法从数组中删除nil值

25

我有一个数组:

scores = [1, 2, 3, "", 4]

我想删除所有的空值。但是当我运行以下代码时:

puts scores.reject(&:empty?)

我遇到一个错误:

undefined method `empty' for 1:Fixnum

我如何以一步操作从数组中移除非整数值?我正在使用Ruby 1.9.3。


你是如何构建数组的呢?里面既有整数又有空字符串,这对我来说似乎是一种奇怪的组合... - Pavling
9个回答

55

只拒绝nil将是:

array.compact


21
如果您想要移除空值,您应该使用blank?函数:(需要Rails / ActiveSupport库)
scores.reject(&:blank?)
#=> [1, 2, 3, 4]

"", " ", false, nil, [], 以及 {} 都是空值。


18

它非常简单:

scores.grep(Integer)

请注意,如果您计划映射这些值,可以在下面的代码块中执行操作:
scores.grep(Integer){|x| x+1 }

如果您想执行相同的操作,但是您的数字是字符串,则会有奖励:

scores.grep(/\d+/){|x|x.to_i}

1
Grep使用了大小写相等运算符(===),我认为那个调用是is_a? - hirolau
更多关于 Ruby 中 case-equality 和类的信息,请参见:http://ruby.about.com/od/beginningruby/qt/On-Case-And-Class.htm - hirolau
你应该使用 Integer,而不是 Fixnum - Stefan
更正,修改了原始帖子。 - hirolau

2
如果你只需要拒绝nil,那么可以这样做:
scores.reject(&:nil?)

这相当于scores.compact。 - Tim Peters

2
试试这个:
scores.select{|e| e.is_a? Integer}
# => [1, 2, 3, 4]

1
scores = [1, 2, 3, "", 4, nil]
scores.reject{|s| s.to_s == ''}
# => [1, 2, 3, 4]

1
这对我有效。
scores.reject!{|x| x.to_s.empty?}

如果真的需要,不要使用bang方法。 - Arup Rakshit

0
scores.select{|score| score.is_a? Fixnum}

或者,由于Fixnum继承自Integer,您也可以选择

scores.select{|score| score.is_a? Integer)

如果这样更具描述性,那就这样做。

数组和可枚举对象往往提供了许多完成同一件事情的方法。


0

&:empty? 可以用于哈希、数组和字符串,但不能用于数字。在 reject 中使用的方法必须对列表中的所有项目有效。因此,&:blank? 可以很好地工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接