我假设目标是在给定的数组中找到相等元素最长序列的第一个元素的索引。
my_array = [100, 101, 100, 102, 100, 100, 101, 100, 250, 251, 253, 260, 250, 200,
100, 100, 100, 100, 100, 100, 100, 100, 100,
120]
这里是14
,是后面还有8个100
的100
的索引。
我们可以按照以下方式进行操作。
my_array.each_index.chunk { |i| my_array[i] }.
max_by { |_,a| a.size }.
last.
first
步骤如下:
enum0 = my_array.each_index
#=> #<Enumerator: [100, 101, 100,..., 100, 120]:each_index>
我们可以通过将此枚举器转换为数组来查看将生成的元素。
enum0.to_a
继续,
enum1 = enum0.chunk { |i| my_array[i] }
#=> #<Enumerator: #<Enumerator::Generator:0x000058d8d09ec8a0>:each>
考虑到上述表达式的返回值,
enum1
可以被视为一个
复合枚举器,尽管 Ruby 没有这样的概念。让我们看看
enum1
将生成哪些值。
enum1.to_a
#=> [[100, [0]], [101, [1]], [100, [2]], [102, [3]], [100, [4, 5]],
# [101, [6]], [100, [7]], [250, [8]], [251, [9]], [253, [10]],
# [260, [11]], [250, [12]], [200, [13]],
# [100, [14, 15, 16, 17, 18, 19, 20, 21, 22]],
# [120, [23]]]
继续,
a = enum1.max_by { |v,a| a.size }
#=> [100, [14, 15, 16, 17, 18, 19, 20, 21, 22]]
作为代码块中未使用
v
的变量,该表达式通常应该写成:
a = enum1.max_by { |_,a| a.size }
下划线的存在(作为有效的局部变量)告诉读者该块变量在块计算中未被使用。最后两步如下所示。
b = a.last
b.first
请参见 Enumerable#chunk和 Enumerable#max_by。