Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如果数组只包含空字符串,则使用更优雅的方法拒绝该数组_Ruby_Arrays_Ruby On Rails 3 - Fatal编程技术网

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的进一步讨论很好:如果所有元素都为空,他只想拒绝数组。