向我解释一下:arr.detect |e| arr.rindex(e) != arr.index(e)

Posted

技术标签:

【中文标题】向我解释一下:arr.detect |e| arr.rindex(e) != arr.index(e)【英文标题】:Explain this to me: arr.detect |e| arr.rindex(e) != arr.index(e) 向我解释一下:arr.detect |e| arr.rindex(e) != arr.index(e) 【发布时间】:2015-07-10 17:53:05 【问题描述】:

所以我相信我理解这段代码。在 codewars 中提示我返回提供的数组中的重复项。这是我经过一番搜索后得出的结论。我对 Ruby 很陌生,想彻底理解这段代码,而不是仅仅用它来通过代码挑战。

如果我错了,请纠正我,或者添加我遗漏的任何内容......

arr 是数组。 .detect 是一种将枚举中的每个条目通过块传递的方法。然后它返回第一个块不为假的。

在这种情况下,它通过:

|e| arr.rindex(e) != arr.index(e)  

这个block的过程是e代表enum中的每一个entry。

.rindex(e) 在数组中从最后一个到第一个 e 搜索并返回在参数 () 部分中描述的匹配数组对象编码。 .index(e) 返回数组中第一个为真的对象。

所以,为了总结这一切,“.rindex”从数组的末尾开始检查第一个真正的对象,而 .index 做同样的事情,但从数组的开头直到他们达到了使 .rindex.index 为假的数字。由于块本身为真(arr.rindex(e) 不等于 arr.index(e)),detect 返回的是重复的对象。

    arr.detect |e| arr.rindex(e) != arr.index(e) 

这一切对我来说仍然感觉很高,如果有人能更好地分解它对我来说会是有益的。提前致谢!

【问题讨论】:

【参考方案1】:

您非常接近,但 #index#rindex 返回数组索引(位置),在该处找到匹配 e 的元素,分别从左侧和右侧开始。当从 index 和 rindex 返回的值不匹配时,您知道您发现了重复项。例如,给定:

arr = [:a, :b, :b, :c]
arr.index(:b) # => 1
arr.rindex(:b) # => 2

每个条目的数组索引是0, 1, 2, 3。这里,从左侧搜索,:b 首先在位置 2(索引 1)找到,但从右侧搜索,首先在位置 3(索引 2)找到。由于索引不匹配,您知道您找到了两个具有相同值但在数组中的位置不同的元素,因此您有重复。

(顺便说一句,这个技巧是one of my better-voted SO answers。呵呵。)

【讨论】:

是的,你在那里完全打败了我 :) 大声笑。感谢克里斯,无论是回答还是解释。目前完全是菜鸟,渴望不成为。【参考方案2】:

很快:

index(e) 是包含 e 的数组的第一个槽的索引 rindex(e) 是包含 e 的数组的最后一个槽的索引

如果 index(e) 与 rindex(e) 不同,则至少有两个包含 e 的槽。

【讨论】:

以上是关于向我解释一下:arr.detect |e| arr.rindex(e) != arr.index(e)的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用存储库模式或者请向我解释一下?

有人可以向我解释一下:'create(email: emailArg = ) '吗?

有人可以向我解释一下这个 Chunk Size 值吗

Perl:请向我解释一下 while() 的以下行为

有人可以向我解释一下逻辑回归中成本函数和梯度下降方程之间的区别吗?

adobe air vs flex vs flash builder ---我需要解释一下