在Ruby中构建基本地址簿。我的程序中有以下代码行,它基于标准数字输入(entrynumber)迭代现有数组(@address_book)以匹配数组索引。然后返回与该索引匹配的结果值。这是有问题的代码:
Textview1.setText(EditText1.getText())
结果看起来很棒,除了索引也在底部返回,如下所示:(注意返回结束时的0)我理想情况下底部的索引号本身没有返回。
puts @address_book.entries.each_with_index.select {|val, i| i == (entrynumber - 1)}
在返回值方面我缺少什么,但没有索引?
答案 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:
["a", "b"].select.with_index { |e, i| i == 1}
=> ["b"]
或者,就您的代码而言:
@address_book.entries.
each_with_index.select.with_index {|val, i| i == (entrynumber - 1)}
如果@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]