2

私は tictactoe プログラムを書き、それをクラスに編成しようとしています。

class Board
  attr_accessor :fields

  def initialize
    self.fields = {
      '1' => ' ', '2' => ' ', '3' => ' ',
      '4' => ' ', '5' => ' ', '6' => ' ',
      '7' => ' ', '8' => ' ', '9' => ' '
    }
  end
  def set_stone_at(position, stone)
    fields[position] = stone
  end
  def stone_at(position)
    stone = fields[position]
    puts stone
  end
  def show
    puts fields
  end
end

class Game
  attr_accessor :board

  def initialize
    self.board = Board.new
  end
  def print_board
    puts "\n  #{fields['1']} | #{fields['2']} | #{fields['3']}"
    puts "  --*---*---"
    puts "  #{fields['4']} | #{fields['5']} | #{fields['6']}"
    puts "  --*---*---"
    puts "  #{fields['7']} | #{fields['8']} | #{fields['9']} \n"
  end
end

board = Board.new
board.show
Game.new.board.show
game = Game.new
game.board.set_stone_at('1', 'X')
game.board.set_stone_at('2', 'O')
game.print_board

classの classfieldsから変数にアクセスできません。エラーが発生しています:BoardGame

in `print_board': undefined local variable or method `fields' for #<Game:0x007ffc1a895710> (NameError)

あらゆる種類の助けをいただければ幸いです。助けと説明に感謝します。

4

2 に答える 2

2

board.fieldsの代わりに書いてくださいfields

ところで、変数はありませんfields。変数を参照するfieldsclassにインスタンス メソッドがあります。Board@fields

于 2015-12-20T12:08:47.743 に答える
1

申し訳ありませんが、携帯電話で応答します。self.board.fieldsこれを一瞥すると、ゲーム内の print_board メソッドに入れたいようです。Fields は、Board クラスのアクセサーです。これを board クラスのインスタンスに送信します。ゲームでは、初期化が実行された場合に利用可能なボードのインスタンスを持つアクセサー、ボードがあります。したがって、ゲームを利用可能にしたい場合は、ゲームをインスタンス化する必要があります。あなたはそれをしたように見えます。@board.fieldsprint メソッドを試すこともできます。あなたが作ったボードアクセサでも動作すると思います。

-- 実際のコンピューターに到達した後にこれを追加します。これは、Ruby の「自己」に大きく関係しています。あなたはすでにここで始める方法について十分に基本的なことを理解しているようですが、@WandMaker が述べたように、#print メソッドをオフボードにする方が簡単ですが、このようにしてくれてうれしいです。'self in ruby​​' は、価値のある関連記事をたくさん見つけます。より広いコンテキストとより良い学習体験のために、「The Well Grounded Rubyist」もお勧めします。メタプログラミングを学べば、これやその他の非常に役立つことについてもよく理解できると思います。そのためには、PragProgs の「Meta-Programming Ruby」や、Ruby Monk のメタプログラミング レッスンhttp://rubymonk.com/learning/books/が適しています。

Sandi Metz の「Practical Object Oriented Ruby」がベストかもしれませんが、まだ読んでいません。をしたい...

行かないと!

于 2015-12-20T12:08:44.570 に答える