将程序拆分为 classes 并从一个 class 访问另一个变量

Splitting program into classes and accessing variables from one class in another

我写了一个 tictactoe 程序,我正在尝试将它组织成 classes。

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 Board class Game 中访问变量 fields。我收到错误:

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

如有任何帮助,我将不胜感激。感谢您的帮助和解释。

抱歉,正在用手机回复 phone。乍一看,您似乎想在游戏的 print_board 方法中使用 self.board.fields。 Fields 是 Board class 上的访问者。您需要将其发送到板 class 的一个实例。在 Game 中,如果初始化运行,您有一个访问器 board,其中有一个可用的 board 实例。因此,如果您希望游戏可用,您需要确保实例化游戏。看起来你确实那样做了。您也可以在打印方法中尝试 @board.fields 。我认为这也适用于您制作的电路板访问器。

-- 进入真实计算机后添加此内容。这与Ruby中的'self'有很大关系。您似乎已经对如何从这里开始有了很好的基本掌握,尽管正如@WandMaker 提到的那样,在板外制作 #print 方法会更容易,但我很高兴您这样做了。 'self in ruby' 会出现很多有价值的相关帖子。对于更广泛的 context/better 学习经验,我还推荐 'The Well Grounded Rubyist'。如果您学习一些元编程,我认为您也会对这个和其他非常有用的东西有很好的理解。为此,PragProgs 的 'Meta-Programming Ruby' 很好,Ruby Monk http://rubymonk.com/learning/books/.

上的元编程课程也很好 Sandi Metz 的

'Practical Object Oriented Ruby' 可能是最好的,但我还没有读过。想要...

该走了!

board.fields 而不是 fields

顺便说一句,你没有变量fields;您在 class Board 上有一个实例方法 fields,它引用变量 @fields.