Ruby数组仅在collect语句中存储最后一项

时间:2013-07-18 10:36:53

标签: ruby rubymotion

我有一个通过搜索查询数组的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”。如果您搜索任何其他项目,它会发回一个空数组。我已经尝试了每个声明和一个收集声明,但没有任何方法可行。无论我搜索哪个项目,如何将其附加到空数组?

3 个答案:

答案 0 :(得分:1)

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

这是一个例子

text = 'Ridge'

> churches.select{|c| c.include?(text)}
#=> ["Oak Ridge Baptist"]

答案 1 :(得分:0)

你的文字价值是多少?如果你正在执行文本(“Calvary”)== church ..它匹配@ churches的一个元素。@churches元素单独存储在@search_results中。所以存储最后一个元素。

答案 2 :(得分: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