为什么在Ruby中使用keep_if会跳过数组中的第一个元素?

克里斯托弗·伯德
def unique(arr)
  return arr.keep_if { |x| arr.count(x) == 1 }
end

print unique([2, 5, 5, 4, 22, 8, 2, 8])
#=> [4, 22, 2]

值2在数组中出现两次,但是使用以下方法会错误地返回它。为什么会发生这种情况,我应该怎么做才能解决?

哈姆斯

不幸的是,这是由于在工作方式方面存在一些隐藏行为keep_if为了说明这种行为,我们可以使用调试果园中挂得最少的果实,很好ol' puts

def unique(arr)
  return arr.keep_if { |x| 
    puts x, arr.join(',')
    arr.count(x) == 1
  }
end

print unique([2, 5, 5, 4, 22, 8, 2, 8])

这为我们提供了以下输出:

2
2,5,5,4,22,8,2,8
5
2,5,5,4,22,8,2,8
5
2,5,5,4,22,8,2,8
4
2,5,5,4,22,8,2,8
22
4,5,5,4,22,8,2,8
8
4,22,5,4,22,8,2,8
2
4,22,5,4,22,8,2,8
8
4,22,2,4,22,8,2,8
[4, 22, 2]

仔细查看当方法发现要保留的新值时会发生什么情况:它将值存储在数组的早期索引之一中,覆盖已存在的值。下次找到要保留的值时,将其放在下一个位置,依此类推。

这意味着第一次keep_if查看时2,它会看到其中的两个,因此决定跳过它。但随后4,它看到了要保留的a,并覆盖了第一个2因此,第二次看到a时2,它决定保留它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何跳过数组中的第一个元素?

为什么我的for循环会跳过数组中的最后一个值?

为什么boost :: python迭代器会跳过第一个元素?

为什么for循环会更改for循环中的列表后跳过第一个元素?

为什么 apply 跳过用于参数的数组的第一个元素?

跳过Golang中数组的第一个元素

d3 在附加圆圈时跳过数组中的第一个索引

链表遍历会跳过第一个元素

为什么使用扫描仪要求用户输入的 Java while 循环会跳过第一个输入

Ruby:从数组中删除第一个元素的最简单方法是什么?

LOOKUP为什么不匹配数组中的第一个元素?

为什么不在php中显示此数组的第一个元素?

为什么将\ 0定义为C中char数组的第一个元素?

SQL INSERT 为什么它只添加数组中的第一个元素?

为什么我的脚本仅访问数组中的第一个元素?

为什么foreach从数组中跳过一个元素

为什么将0作为数组的第一个元素会阻止“ for”循环执行。[JavaScript]

为什么在排序数组的第一个元素中得到一个随机数?

为什么awk split()使第一个字段成为数组中的最后一个元素?

PHP使用array_combine()跳过第一个数组元素

跳过DLang数组中的第一个argv

为什么在三元运算符中使用“ 0”会返回第一个值?

为什么 yytext 跳过 YACC 中的第一个输入?

如果findFirst()找到的第一个元素为null,为什么会抛出NullPointerException?

为什么`zip`从第一个迭代器中又吃了一个元素?

为什么%d指向数组的指针给我数组的第一个元素?

通过数组的第一个元素排序SELECT?

使用ruby根据数组的第一个元素组合数组值

为什么解析第一个字符串数组中的数据时会引发异常,而跳过第一个数组时却不会引发异常?