【发布时间】:2014-12-17 21:10:17
【问题描述】:
我正在编写一个棋盘游戏,作为 Ruby OOP 学习练习的一部分。我正在尝试创建一个游戏板,该游戏板由九个空间组成,三排三排。下面是当前无法运行的代码的sn-p:
class Board
def initialize()
#dynamically creates instances of the Space class named @s1 through @s9 with #s 1-9 as the location parameter
9.times do |x|
x += 1
y = "@s" + x.to_s
instance_variable_set( y , x.to_s) = Space.new
end
end
def print_board
#prints a 3X3 grid containing each instance's location parameter
puts "\n\n#{@s1.location}|#{@s2.location}|#{@s3.location}\n-----\n#{@s4.location}|#{@s5.location}|#{@s6.location}\n-----\n#{@s7.location}|#{@s8.location}|#{@s9.location}\n\n\n"
end
end
class Space
attr_accessor :location
def initialize(location)
@location = location
end
end
board = Board.new
board.print_board
想要的输出是:
X|X|X
-----
X|X|X
-----
X|X|X
...但我不断收到与创建 Space 类实例相关的错误。我尝试了很多不同的东西,以至于我都记不起来了。我知道必须有一种方法可以做到这一点,但我是 Ruby 新手,这让我很困惑。我知道可以只创建 Space 类的 9 个单独实例,但这看起来既便宜又脏。
【问题讨论】:
-
也许你想要
instance_variable_set(y , Space.new(x.to_s))? -
...Aaaaaand circle 得到 square...就是这样。我是如此接近!如何将其标记为解决方案?
-
您真的不想为每个单元格设置单独的变量。拥有一个数组或哈希的单一实例变量要好得多。
-
为什么会这样(我是派对新手)?练习是创建一个井字游戏,虽然这很容易通过程序完成(不是使用数组/哈希使任何程序化),但练习的目标是学习 OOP,所以我试图最大限度地利用我/掌握/通过实践理解对象和相关事物。
-
@spectre6000 数组旨在通过索引(例如 1..9)访问对象。将索引放在变量名中并使用
instance_variable_set具有相同的效果,但它真的很hacky,可能会导致很多意想不到的问题。