won?
メソッドはどのように動作しますか?それが勝利の位置を設立するまで
それは、一つ一つ、すべての可能なWIN_COMBINATIONS
を流れる電流@board
を探しています。
これは、detect
が対象です。 docsから:
ブロックに列挙内の各エントリを渡します。 ブロックの最初のものを返します。
最初の位置を獲得する(detect
ブロック内側すなわち条件はfalse
で)一致していないのであればそれは次のいずれかに移動します。一致するとすぐに検索が停止します(条件はtrue
)。
won?
はどのようにposition
を使用していますか?
position
location
は@board
配列のインデックスである所与location
、で@board
の値を返します。入賞組合せにおけるすべてのlocation
(すなわちcombo
のすべての値)が同じ値を持ち、その値が空白であるか否かをチェックする場合
won?
を比較する(私はposition_taken?
がそのチェックを行うことを想定します)。
x | o | o
---+---+---
x | x | x
---+---+---
o | |
として@board
コンテンツに変換:
は、例えば、次の位置でボードを考慮
["x", "o", "o", "x", "x", "x", "o", " " ," "]
# 0 1 2 3 4 5 6 7 8
第2の配線は、アレイ内の各位置のインデックスを示し;私は参考のためだけにそれを含めます。
ので、won?
が呼び出されたときに、それはそうのように、WIN_COMBINATIONS
を反復処理:
に変換
# First iteration
combo = [0,1,2]
position(0) == position(1) && position(1) == position(2) && position_taken?(0)
:
@board[0] == @board[1] && @board[1] == @board[2] && position_taken?(0)
そしてへ:
"x" == "o" && "o" == "o" && true
この意志最初の共同会社以来false
に評価(true
を返すために)(&&
オペレータすべての条件がtrue
である必要がある場合)。それはfalse
あるので、
ので、反復は続く:に変換
# Second iteration
combo = [3,4,5]
position(3) == position(4) && position(4) == position(5) && position_taken?(0)
:
@board[3] == @board[4] && @board[4] == @board[5] && position_taken?(3)
そしてその後に:
"x" == "x" && "x" == "x" && true
これは、以来true
と評価されますすべて comビンビンはtrue
であるため、反復は停止し、win?
もtrue
と評価されます。 as pointed outはengineersmnkyにより、won?
が truthy値[3,4,5] (Array)
ないtrue (TrueClass)
のを返します、
注意してください。
「won?」メソッドはどこですか? –
明らかに、コードはより大きなクラスの一部ですが、あなた自身が実行可能ではない抜粋のみを表示しています。助けを得るためには、[mcve]を提供する必要があります。 – Stefan
def won? WIN_COMBINATIONS.detect do | combo | 位置(コンボ[0])==位置(コンボ[1])&&位置(コンボ[1])==位置(コンボ[2])&& position_taken?(コンボ[0]) エンド エンド –