-1

我有一个通过搜索查询数组的 ruby​​ 方法。根据在搜索栏中键入的内容,它将该项目附加到屏幕上显示的另一个数组中。下面是我的方法:

@churches = ["UGBC", "Oak Ridge Baptist", "Calvary"]
@search_results = []


def search_for(text)
  @churches.collect do |church|
    if text == church
      @search_results << church
    end
  end
end

当代码被触发时,搜索时返回的唯一对象是数组中的最后一个对象:“Calvary”。如果您搜索任何其他项目,它会发回一个空数组。我尝试了 each 语句和 collect 语句,但没有任何效果。无论我搜索什么项目,如何让它附加到空数组?

4

3 回答 3

1

你没有使用正确的方法。我认为 Array#select 是你需要的。此外,您可能需要对文本进行子字符串检查。

这是一个例子

text = 'Ridge'

> churches.select{|c| c.include?(text)}
#=> ["Oak Ridge Baptist"]
于 2013-07-18T10:53:30.183 回答
0

你的文本值是多少?如果您正在执行 text("Cal髅地") == Church.. 它匹配 @churches 的元素之一。该 @churches 元素单独存储在 @search_results 中。所以存储最后一个元素。

于 2013-07-18T10:46:49.320 回答
0

您的函数返回最后一个评估的表达式的值。这就是 的价值@churches.collect。这 - 反过来 - 是块的三个值的数组:

search_for('UGBC')               # => [["UGBC"], nil, nil]
@search_results = []
search_for('Oak Ridge Baptist')  # => [nil, ["Oak Ridge Baptist"], nil]
@search_results = []
search_for('Calvary')            # => [nil, nil, ["Calvary"]]
@search_results = []
search_for('something else')     # => [nil, nil, nil]

该块nil在不匹配的情况下产生,并且在匹配的情况下附加@search_result找到。church

请注意,您的函数会修改@search_results. 所以我重置它以隐藏以前运行的副作用。

对您的函数的一个明显修复是返回@search_results

def search_for(text)
  @search_results = []
  @churches.collect do |church|
    if text == church
      @search_results << church
    end
  end
  @search_results # or even: return @search_results
end

一个更好的实现返回找到的元素或者nil

def search_for(text)
  @churches.find { | c | c == text }
end
于 2013-07-18T11:51:17.740 回答