2013-10-31 5 views
-1

나는 지금 루비 각 반복자 반환 배열이 아닌 부울

def board_check? 
    @board.each {|row| check_row_for_truth_conditions(row)} 
end 

def check_row_for_truth_conditions(row) 
    return true if row.include("foo") 
    false 
end 

다음 (절단/읽기 쉽도록 의역)

각 반복자는 항상 이상 반복되는 컬렉션임을 암시 적 반환과 같은 코드가 있습니다. 즉; 나는 배열을 되돌려 놓는다. 내가 리팩터링을하지 않고 다음과 같은 것을하면 예상대로 작동합니다. 그러나 나는 많은 장소 (그리고 훨씬 더 긴)에 check_row_for_truth_conditions을 사용하기 때문에 버려지

def board_check? 
    @board.each do |row| 
    return true if row.include("foo") 
    false 
    end 
end 
+0

내가 그것을 알아 냈어. 어떤 것을 사용해도 원하는 것을 얻을 수 있습니까? 각각 대신에. 그래서'@ board.any? {| 행 | check_row_for_truth_conditions (row)}' – user2892536

답변

2

각 (false)에 전달 된 블록의 반환 값을 그것을 밖으로 리팩토링하고 싶습니다. 명시 적 리턴은 블록이 아니라 메소드에서 리턴되기 때문에 작동합니다.

def board_check? 
    @board.each do |row| 
    return true if row.include("foo") 
    end 
    return false 
end 

하지만 실제로 당신은 any?를 사용하려면 : 대신 원하는

또한
def board_check? 
    @board.any? do |row| 
    row.include("foo") # or perhaps check_row_for_truth_conditions(row) 
    end 
end 

, 당신의 check_row_for_truth_conditions가 단순화 될 수있다 그냥이 :

def check_row_for_truth_conditions(row) 
    row.include("foo") 
end 

명시 적 반환을위한 필요 없음 true/false.

+0

고마워! 당신이 타이핑하는 동안 나는 어떤 권리라도 사용해야한다고 생각했습니다 :) 가능한 한 빨리 받아 들일 것입니다. – user2892536

2

하나의 옵션은 다음과 같습니다

def board_check? 
    @board.any? {|row| row.include("foo") } 
end