2017-11-24 1 views
0

メソッドが作成されたときに、メソッドが呼び出されるたびに戻り値が返されます。ここで私が何を考え、私はシンプルにそれを望んでいたの迅速なバージョンがありますが、一見、私はそれ自体に情報を格納doesntのこのようなRuby - それがOかXのターンであるかどうかを調べるメソッド

def count() 
    count = 0 
    if count.odd? 
     return "X" 
    else count.even? 
     return "O" 
    count = count+1 
    end 
end 
+1

コードを書くとき、特に学習するときにインデントが*スーパー重要*であることを忘れないでください。このコードはちょっと混乱していて、ここの構造は誤解を招きます。 – tadman

+0

count = count + 1が実行されたときを考えてみましょう... ... –

+1

これらの行を使って、countとcountを返すメソッドcountを作成しました。 Rubyはこれに対処できるかもしれませんが、コードを読んでいる人や自分自身を混乱させるでしょう。 – steenslag

答えて

5

方法が行くそれらのローカル変数を持っていることを実現し、より多くの複雑になっています「範囲外」になったとき、つまりメソッドが終了したときに、離れてしまいます。あなたは、このデータを永続化したい場合には、例えば、クラスのコンテキスト内でインスタンス変数を使用する必要があります。

class Counter 
    def initialize 
    @count = 0 
    end 

    def count 
    @count += 1 

    @count.odd? ? 'O' : 'X' 
    end 
end 

クラスがインスタンスとすることができます。このインスタンスでを作成をインスタンス化することができます@countのような変数を定義することによって、必要なだけローカルデータを保持してください。

次に、あなたはこのようにそれを使用することができます:あなたはcount交互'X''O'を返すために、という仮定をした

counter = Counter.new 
counter.count 
# => 'O' 
counter.count 
# => 'X' 
counter.count 
# => 'O' 
+0

恐ろしい私は本当に助けに感謝!私はあなたがそこでやったことを大まかに理解しているので、クラスのようなものは分かりません。 –

+0

オンラインフォームでも印刷でも入手できる[Ruby introduction book](http://ruby-doc.com/docs/ProgrammingRuby/)があります。印刷されたバージョンはより最新のものですが、古いオンラインのものはまだかなり良いですし、基本的なことを示す必要があります。 – tadman

1

、されていcount回数のカウントを維持することが必要ですと呼ばれる。しかし、これは、countの次のバージョンで示されているように、そうではありません。 Rubyは "速記" という表現@enum ||= ['X', 'O'].cycleを見たとき、彼女が最初に行うことがcountが最初に呼び出された

@enum = @enum || ['X', 'O'].cycle 

@enum #=> nilに展開され

def count 
    @enum ||= ['X', 'O'].cycle 
    @enum.next 
end 

count #=> "X" 
count #=> "O" 
count #=> "X" 
count #=> "O" 

。私たちは、そのためであるcount

@enum ||= ['X', 'O'].cycle 
    #=> @enum = @enum || ['X', 'O'].cycle 
    #   = #<Enumerator: ["X", "O"]:cycle> || #<Enumerator: ["X", "O"]:cycle> 
    #   = #<Enumerator: ["X", "O"]:cycle> 

に後続の呼び出しで

@enum ||= ['X', 'O'].cycle 
    #=>  = nil || #<Enumerator: ["X", "O"]:cycle> 
    #   = #<Enumerator: ["X", "O"]:cycle> 

を得る、@enumは変更されません。 (#<Enumerator: ["X", "O"]:cycle>||以下であっても評価されません。)

私たちは、その後、

@enum.next #=> "X" 
@enum.next #=> "O" 
@enum.next #=> "X" 
@enum.next #=> "O" 

Array.cycleEnumerator#nextのためのドキュメントを参照してくださいしています。

+0

私はこれがもっと好きです。 –

+0

Btw @記号は何を表していますか?それを見つけようとしましたが、見つけられませんでした。 –

+0

'@ enum'はインスタンス変数、' enum'はローカル変数、 '$ enum'はグローバル変数です。インスタンス(またはグローバル)変数は、あるメソッド呼び出しから次のメソッド呼び出しまでの値が保持されるようにする必要があります。 –

関連する問題