My TIPs for the programing

プログラミング学習記録

【テストプログラムを作成2】クラスの変数【ruby】

syntaxエラーが発生。

先輩さん曰く、irbを起動してコピペしてはっつけてみると良いとのこと。

irb(main):001:0> result = (player_123 - machine_012 +3)% 3
SyntaxError: (irb):1: syntax error, unexpected tINTEGER, expecting keyword_do or '{' or '('
result = (player_123 - machine_012 +3)% 3
                                     ^

うーむ、

irb(main):002:0> result = (2 - 2 +3)% 3
=> 0

あー、定義してないからか。 でもさっきはできてたぞ?

あ、テスト用に判定部分をメソッド化したからですね。

    def judge
      result = (player_123 - machine_012 +3)% 3
      print "あなたは#{gcp_to_japanese[player_gcp]}、私は#{gcp_to_japanese[machine_gcp]}、"
      case result
      when 0
        puts "あなたの勝ちです。"
        return "勝ち"
      when 1
        puts "引き分けです。"
        return "あいこ"
      when 2
        puts "あなたの負けです。"
        return "負け"
      end
    end

色々とインスタンス変数にして見ます。

class Janken
    @player_input_to_integer = {'g'=> 1 ,'c' => 2 ,'p' => 3 }
    @machine_integer_to_input = { 0 => "g" ,  1  => "c",  2  => "p"}
    @machine_list_janken = [0,1,2]
    @gcp_to_japanese = {'g'=>'グー','c' => 'チョキ','p'=>'パー'}

    def janken_random
      puts "input g or p or c"
      print "you:"

      player_gcp = gets.chomp
      p @player_input_to_integer
      player_123 = @player_input_to_integer[player_gcp]

      machine_012 = @machine_list_janken[rand(3)]
      machine_gcp = @machine_integer_to_input[machine_012]
      # puts "machine:#{machine_gcp}"
    end

    (略)
end

読み込まれません。

クラスの変数?ああ、インスタンス変数っしょwつーかこれからっしょw

ってくらいの理解しかありませんでした。勉強不足。

先輩さん曰く・・

インスタンス変数をクラス内のメソッドでは使えない。 インスタンス変数をクラス直下に定義すると読み込まれない。従ってinitialize内にて定義する。

使うためにはinitialize メソッド内に記述する。 インスタンス変数はクラスからオブジェクトを生成する際にインスタンスごとに異なる変数を格納したい場合に使う。

リファレンスマニュアルより

初期化されていない インスタンス変数を参照した時の値はnilです。

私がインスタンス変数を使用したハッシュ等は、インスタンスごとに値が変更されることはない。

従って・・・

定数CONST や、 クラス変数@@constを使うべきです。

クラス変数を使用してみました。 f:id:mavol:20171117123749p:plain ほぼクラス変数に。atomが真っ赤

$ ruby janken_exe.rb
input g or p or c
you:g
あなたはグー、私はチョキ、あなたの勝ちです。

一応できたけど、被テストプログラムの構造がテストに向いていなかった。その辺を追記。

雑記

rubyの定数は、定数と言いつつ変更可能。 本当の意味で定数にするにはfreezeメソッドを使用する。