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