使用each_with_index方法时返回带有值的索引

时间:2015-07-23 20:29:46

标签: ruby

在Ruby中构建基本地址簿。我的程序中有以下代码行,它基于标准数字输入(entrynumber)迭代现有数组(@address_book)以匹配数组索引。然后返回与该索引匹配的结果值。这是有问题的代码:

Textview1.setText(EditText1.getText())

结果看起来很棒,除了索引也在底部返回,如下所示:(注意返回结束时的0)我理想情况下底部的索引号本身没有返回。

     puts @address_book.entries.each_with_index.select {|val, i| i == (entrynumber - 1)}

在返回值方面我缺少什么,但没有索引?

2 个答案:

答案 0 :(得分:2)

问题

麻烦在于each_with_index正在将@address_book.entries转换为数组数组。这是我的意思的一个例子:

["a", "b"].each_with_index.to_a
# => [["a", 0], ["b", 1]] 

因此,当您将select应用于each_with_index时,所选元素将分别成为包含元素及其索引的数组:

["a", "b"].each_with_index.select { |e, i| i == 1 }
=> [["b", 1]] 

错误修复

您可以通过使用#map仅选择每个选定行的第一个元素来解决此问题:

["a", "b"].each_with_index.select { |e, i| i == 1 }.map(&:first)
 => ["b"] 

使用select.with_index

更好的是,您可以使用select.with_index:

["a", "b"].select.with_index { |e, i| i == 1}
 => ["b"] 

或者,就您的代码而言:

@address_book.entries.
  each_with_index.select.with_index {|val, i| i == (entrynumber - 1)}

使用Array#[]

如果@address_book.entries是一个数组,那么你可以index the array,而不是完全使用select:

@address_book_entries[entrynumber - 1]

如果它不是数组,您可以使用#to_a将其变为一个数组:

@address_book.entries.to_a[entrynumber - 1]

但是,如果@ address_book.entries很大,这可能会占用大量内存。将枚举转换为数组时要小心。

答案 1 :(得分:0)

看起来你想要它得到的单个项目实际上不是select最适合的项目(特别是当你通过索引检索它时。我可能会做类似的事情:< / p>

@address_book.entries.to_a[entrynumber - 1]