Ruby按索引选择

Ama*_*ley 11 ruby arrays

我试图从数组中选择元素:

arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
Run Code Online (Sandbox Code Playgroud)

其索引是斐波纳契数.我想要结果:

['a', 'b', 'c', 'd', 'f', 'i', 'n']
Run Code Online (Sandbox Code Playgroud)

我的代码返回元素和索引.

def is_fibonacci?(i, x = 1, y = 0)
  return true if i == x || i == 0
  return false if x > i
  is_fibonacci?(i, x + y, x)
end

arr.each_with_index.select do |val, index|
  is_fibonacci?(index)
end
Run Code Online (Sandbox Code Playgroud)

此代码返回:

[["a", 0], ["b", 1], ["c", 2], ["d", 3], ["f", 5], ["i", 8], ["n", 13]]
Run Code Online (Sandbox Code Playgroud)

请帮助我理解我如何仍然遍历数组并评估索引,但只返回元素.

Fre*_*ung 25

您可以将代码的最后一位更改为

arr.select.with_index do |val, index|
  is_fibonacci?(index)
end
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为如果你调用一个select没有块的方法,你会得到一个Enumerator对象,然后你可以在其上链接更多的Enumerable方法.

在这种情况下我使用过with_index,这与调用each_with_index原始数组非常相似.但是因为这发生在select而不是之前,所以select返回原始数组中的项目,而不附加索引


use*_*234 3

到目前为止,您的代码看起来很棒,我不会更改它。您可以在事后检查结果,并通过映射每对并仅采用第一个[element, index]将这些对更改为element仅包含:

>> results = [["a", 0], ["b", 1], ["c", 2], ["d", 3], ["f", 5], ["i", 8], ["n", 13]]
>> results.map(&:first)
=> ["a", "b", "c", "d", "f", "i", "n"]
Run Code Online (Sandbox Code Playgroud)