将程序拆分为类并从另一个类中访问变量

时间:2015-12-20 12:00:08

标签: ruby instance-methods

我写了一个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

我无法从班级fields中的班级Board访问变量Game。我收到了错误:

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

我会感激任何帮助。我很感激任何帮助和解释。

2 个答案:

答案 0 :(得分:2)

board.fields而不是fields

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

答案 1 :(得分:1)

抱歉,用手机回复。从这看起来,看起来你想在游戏中的print_board方法中使用self.board.fields。 Fields是Board类的访问器。您将要将其发送到董事会成员的实例。在Game中你有一个访问器,板,如果初始化运行,它有一个可用的板实例。因此,如果您希望可用,请确保您实例化游戏。看起来你确实那样做了。您也可以在打印方法中尝试@board.fields。我认为这也适用于你制作的主板访问器。

- 在到达真正的计算机后添加此内容。这必须与“自我”做很多事情。在Ruby中。你似乎已经对如何在这里开始有了一个很好的基本把握,尽管如同@WandMaker提到的那样,将#print方法放在船上会更容易,我很高兴你这样做。 &#39;自我红宝石&#39;会发现很多有价值的相关帖子。为了获得更广泛的背景/更好的学习体验,我还推荐了The Well Ground Grounded Rubyist&#39;。如果你学习一些元编程,我想你也会对这个以及其他非常有用的东西有很好的理解。为此,&#39;元编程Ruby&#39;来自PragProgs很好,Ruby Monk上的元编程课程也是如此http://rubymonk.com/learning/books/

&#39;实用面向对象的Ruby&#39; Sandi Metz可能是最好的,但我还没读过。想... ...

得走了!