将程序拆分为 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
.
我写了一个 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
.