-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

現在、各反復子の暗黙的な戻り値は、常に反復処理中のコレクションです。すなわち; true または false ではなく、配列を取得します。リファクタリングせずに次のようなことをすると、期待どおりに機能します。しかし、私は多くの場所で check_row_for_truth_conditions を使用しています (そしてそれははるかに長いです) ので、リファクタリングしたいと思います

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

2 に答える 2

3

各 ( 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

明示的な return true/は必要ありませんfalse

于 2013-10-31T01:43:36.287 に答える
3

1 つのオプションは次のとおりです。

def board_check?
  @board.any? {|row| row.include("foo") }
end
于 2013-10-31T01:44:43.203 に答える