Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将程序拆分为类并从一个类访问另一个类中的变量_Ruby_Instance Methods - Fatal编程技术网

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

Ruby 将程序拆分为类并从一个类访问另一个类中的变量,ruby,instance-methods,Ruby,Instance Methods,我写了一个Tictatcoe程序,我正试图把它组织成班级 class Board attr_accessor :fields def initialize self.fields = { '1' => ' ', '2' => ' ', '3' => ' ', '4' => ' ', '5' => ' ', '6' => ' ', '7' => ' ', '8' => ' ', '9' =>

我写了一个Tictatcoe程序,我正试图把它组织成班级

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
游戏
中,我无法从class
棋盘
访问变量
字段
。我得到一个错误:

in `print_board': undefined local variable or method `fields' for #<Game:0x007ffc1a895710> (NameError)
'print_board'中的
:未定义的局部变量或#的方法'fields'(NameError)

我将感谢任何帮助。非常感谢您的帮助和解释。

对不起,请用手机回复。从上面看,看起来您希望在游戏中的打印板方法中有
self.board.fields
。Fields是Board类上的访问器。您需要将其发送到board类的实例。在游戏中,你们有一个访问器,棋盘,其中有一个棋盘的实例,若初始化运行。所以,如果您希望游戏可用,您需要确保实例化该游戏。看来是你干的。您也可以在打印方法中尝试
@board.fields
。我认为这也将与您制作的板访问器一起工作

-- 在进入一台真正的计算机后添加这个。这与Ruby中的“self”有很大关系。您似乎已经很好地掌握了如何在这里开始的基本知识,尽管正如@WandMaker所提到的,在板外制作打印方法会更容易,但我很高兴您这样做。”《红宝石中的自我》将会出现很多有价值的相关帖子。为了获得更广泛的背景/更好的学习体验,我还推荐“基础扎实的红宝石专家”。我想如果你学习一些元编程,你也会对这个和其他非常有用的东西有很好的理解。因此,PragProgs中的“元编程Ruby”很好,Ruby Monk上的元编程课程也很好

Sandi Metz的“实用的面向对象Ruby”也许是最好的,但我还没有读过。想


我得走了

写入
线路板.字段
而不是
字段


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

,将
打印板
方法移动到
类,
游戏
类似乎做得不多,是的,它是这样工作的,但我认为合乎逻辑,印刷板应该在游戏类中,还是我错了?我不会说你错了,因为这是一个意见问题。就我个人而言,我更喜欢那些需要访问
董事会
的私人成员的方法,它们应该在
董事会
内部,将
董事会
的内部状态暴露给外部世界似乎是错误的。您在
设置stone_在
设置stone_在
中正确地使用了
字段的变异方法,因此似乎没有必要通过
attr_访问器
@ayda公开
字段
,您还需要了解什么?你是带着其他语言的经验来Ruby的吗?