Ruby 将程序拆分为类并从一个类访问另一个类中的变量
我写了一个Tictatcoe程序,我正试图把它组织成班级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' =>
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的吗?