2013-07-18 1 views
-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 

이 배열의 마지막 개체입니다 : 다음은 내 방법입니다. 다른 항목을 검색하면 빈 배열을 다시 보냅니다. 나는 각 진술과 수집 진술을 시도했지만 아무 것도 효과가 없을 것이다. 내가 검색 한 항목에 관계없이 빈 배열에 추가하려면 어떻게해야합니까?

+3

보통 나쁜 생각, 경우 :

함수에 대한 명백한 수정 @search_results을 반환하는 것입니다 그 작업이 멱등수 ('''')가 아니라는 것은 개념적으로 나쁘다. – tokland

답변

1

올바른 방법을 사용하고 있지 않습니다. Array # select가 필요한 것 같아요. 또한 텍스트의 하위 문자열 검사를 수행해야 할 수도 있습니다.

여기에 예를 들어

text = 'Ridge' 

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

select 메서드는 내가 찾고있는 메서드입니다. 이제 매번 새로운 배열에 결과를 추가 할 수 있습니다. 고마워. –

0

텍스트 값은 무엇입니까? 당신이 텍스트 ("갈보리") == 교회를 수행하는 경우 그것은 @ 교회의 요소 중 하나와 일치합니다. @ chrches 요소 만 @search_results에 저장됩니다. 마지막 요소를 저장하는 중입니다.

0

귀하의 기능을 평가 마지막 표현식의 값을 반환합니다. 그 값은 @churches.collect입니다. 발견 church

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이 일치시 첨부 : 즉, - - 차례로 블록의 세 값의 어레이이다.

함수가 @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