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

时间:2015-07-10 17:53:05

标签: ruby explain

所以我相信我理解这段代码。我在codewars中提示我返回提供的数组中的副本。这是我经过一番搜索后想出来的。我是Ruby的新手,想彻底了解这段代码,而不是仅仅使用它来传递代码挑战。

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

  • arr 是数组。
  • .detect 是一种通过块传递枚举中每个条目的方法。然后它返回块不为假的第一个。
  • 在这种情况下,它通过:

    {|e| arr.rindex(e) != arr.index(e)}  
    
  • 此块的过程是 e 表示枚举中的每个条目。

  • .rindex(e)从数组中的最后一个 e 进行搜索,并返回参数()部分代码。
  • .index(e)返回数组中第一个为true的对象。

所以,为了把这一切都包起来,“.rindex”从数组的末尾开始检查第一个真实对象,而 .index 从数组的开头直到他们点击了使 .rindex .index 为false的数字。由于块本身为真(arr.rindex(e)不等于arr.index(e)),因此detect返回重复的对象。

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

对我而言,这一切对我来说仍然感觉非常高,如果有人为我打破这一点会更好。提前谢谢!

2 个答案:

答案 0 :(得分:2)

你非常接近,但是#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。嘿。)

答案 1 :(得分:1)

不久:

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

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