2017-12-14 10 views
0

私はこのコードが何をしているのか把握しようとしており、推測しています。私はインスタンス変数に引数を割り当てることに慣れていますが、残りについてはわかりません。このRubyコードはどのように初期化されますか?

どのように私はplayer_1を読んでいる:player_1が値に渡された場合は、インスタンス変数@player_1に割り当て、そしてHumanクラスの新しいインスタンスを作成します。何か不足していますか?

def initialize(player_1 = nil, player_2 = nil, board = nil) 
    player_1 ? @player_1 = player_1 : @player_1 = Players::Human.new("X") 
    player_2 ? @player_2 = player_2 : @player_2 = Players::Human.new("O") 
    board ? @board = board : @board = Board.new 
    @current_player = @player_1 
end 

module Players 
    class Human < Player 
    def move(board) 
     input = gets.strip 
    end 
    end 
end 

答えて

5

@player_1,@player_2および@boardインスタンス変数には、同じ名前の引数として渡されたものが基本的に割り当てられます。何かが欠落していた場合、デフォルト値があります。デフォルト値は、「Xの人間のプレーヤー」、「Oの人間のプレーヤー」、および「新しいボード」です。 Tic-Tac-Toeセットアップのように見えます。


それを書くために、より読みやすい方法は以下のようになり道:

def initialize(first_player = nil, second_player = nil, board = nil) 
    @first_player = first_player || Players::Human.new("X") 
    @second_player = second_player || Players::Human.new("O") 
    @board   = board || Board.new 
    @current_player = @first_player 
end 
+2

正直言って、私は初期化(first_player = Players :: Human.new( "X")、second_player = Players :: Human.new( "O")、board = Board.new)条件なしの変数。 – engineersmnky

+1

@engineersmnky、私は同意します。私の考えは、これにより 'second_player'の値を設定することができなくなりますが、' first_player'のデフォルト値はそのままにしています。理想的には、それらはすべてkwargsでなければなりません。 – ndn

+0

私はkwargsのコメントに確実に同意することができます – engineersmnky

2

initializeの引数はすべて省略可能で、設定されていない場合はnilです。 initializeを呼び出すと、変数がゼロであれば各変数をチェックします。それがnilでなければ、インスタンス変数にパラメータ値を代入します。それ以外の場合は、Player :: HumanまたはBoardを作成します。最後に、current_playerをplayer_1に割り当てます。

+0

私はあなたの説明多くのことを言っていますが、理にかなっています。 – alexnewby

関連する問題