Ruby 如果数组只包含空字符串,则使用更优雅的方法拒绝该数组
我必须通过(行)数组中的(行)数组进行排序。(行)数组包含任意数量的字符串。如果(行)数组只包含空字符串,我想将其从(行)数组中删除 我目前正在这样做:Ruby 如果数组只包含空字符串,则使用更优雅的方法拒绝该数组,ruby,arrays,ruby-on-rails-3,Ruby,Arrays,Ruby On Rails 3,我必须通过(行)数组中的(行)数组进行排序。(行)数组包含任意数量的字符串。如果(行)数组只包含空字符串,我想将其从(行)数组中删除 我目前正在这样做: rows.each do |row| row.each_index do |i| if row[i].length > 0 break elsif i == row.count-1 rows.delete(row) end end end 但是有没有更优雅的方法呢?在迭代时修改数组,虽
rows.each do |row|
row.each_index do |i|
if row[i].length > 0
break
elsif i == row.count-1
rows.delete(row)
end
end
end
但是有没有更优雅的方法呢?在迭代时修改数组,虽然这不是一个好主意-你可能会发现你的代码跳过了某些元素或者做了一些奇怪的事情。我愿意
rows.reject! {|row| row.all? {|row_element| row_element.empty?}}
如果块
row\u元素.empty?
对该行中的所有元素的计算结果均为true,则我们拒绝该行。非常值得熟悉Enumerable中的所有方法,它们对于这类任务非常方便。您可以使用compact.uniq
或compact
。如果数组具有nil
值,则compact将生成一个空数组,因此您可以这样检查:
row.compact.size == 0
row.compact.uniq.first.blank? and row.size == 1
如果行包含空字符串“”,则可以按如下方式检查它:
row.compact.size == 0
row.compact.uniq.first.blank? and row.size == 1
稍微简洁一点:
rows.reject! { |row| row.all?(&:empty?) }
使用rails时:
! rows.any?(&:present?)
这里:
行。全部(&:blank?
最好使用blank?而不是空的?如果其中一个元素为零,则为空?将返回true,而为空?我会非常感谢的。为清晰起见,请编辑您的答案,以显示这将返回一个新数组,保留未触及的行,因为您使用了reject而不是reject!你这样做是因为使用拒绝!因为在OP中需要一个优雅的解决方案,而不是说你的不是,这是完美的解决方案,这将是完美的,考虑这个:<代码>行。拒绝{行}行。所有?&:空?} /代码> @ Ioui空白?是railsism,尽管我想这个问题也被标记为rails。1NDIVISE-不知道你有兴趣在适当的地方做这件事-实际上我认为行。拒绝!在这种情况下是不好的,因为“每次调用块时数组都会立即更改,而不是在迭代结束后更改”(),所以这相当于在迭代过程中修改数组,就像我所做的那样。也许行=行。拒绝!{…}会更好吗?当调用一个方法时,&expression
意味着“计算expression
,对它返回的任何内容调用到\u proc
,并使用到\u proc
返回的值作为此方法调用的块”Symbol#to_proc
的工作原理如下::method_name.to_proc
返回一个类似于{x | x.method_name}
的匿名函数。因此,当您传递一个看起来像{x | x.method}
的块时,您可以始终将其压缩为&:method,在参数列表中应该排在最后。这里对&/to_proc的进一步讨论很好:如果所有元素都为空,他只想拒绝数组。