我正在尝试管理自制对象的2D地图(称为CaseSimple)。 这个2D地图是另一个自制对象,这里称为MapSimple。
我尝试编码。我对CaseSimple坐标(此类的唯一属性)及其所需的值有疑问。
# simple container of coordinates X and Y
class CaseSimple
@coordx
@coordy
attr_reader :coordx, :coordy
def initialize(x, y)
@coordx, @coordy = x, y
#print "\n\nget : ", @coordx, ";", @coordy,"\n"
end
end
# method for return printable string that represent the given map of CaseSimple
def printableMap(map)
s = ""
0.upto(9) do |j|
0.upto(9) do |i|
s += "(" + map[i][j].coordx.to_s + ";" + map[i][j].coordy.to_s + ") "
end
s += "\n"
end
s += "\n"
return s
end
# 2D map of CaseSimple
class MapSimple
@cases
def initialize
@cases = Array.new(10, Array.new(10,nil))
# creat & print without error
print "PRINT AND CREAT :\n"
0.upto(9) do |j|
0.upto(9) do |i|
@cases[i][j] = CaseSimple.new(i,j)
print "(", @cases[i][j].coordx, ";", @cases[i][j].coordy, ") "
end
print "\n"
end
print "\n"
# print cases with printableMap
print "PRINT WITH EXTERN FUNCTION :\n"
print printableMap(@cases) # ERROR
# or without creating CaseSimple
print "PRINT WITHOUT CREAT :\n"
0.upto(9) do |j|
0.upto(9) do |i|
print "(", @cases[i][j].coordx, ";", @cases[i][j].coordy, ") "
end
print "\n"
end
print "\n"
end
# print cases
def to_s()
return printableMap(@cases)
end
end
d = MapSimple.new
print "PRINT BY TO_S METHOD :\n"
print d
并且,我在此代码上使用irb(ruby 1.9.3)。
PRINT AND CREAT :
(0;0) (1;0) (2;0) (3;0) (4;0) (5;0) (6;0) (7;0) (8;0) (9;0)
(0;1) (1;1) (2;1) (3;1) (4;1) (5;1) (6;1) (7;1) (8;1) (9;1)
(0;2) (1;2) (2;2) (3;2) (4;2) (5;2) (6;2) (7;2) (8;2) (9;2)
(0;3) (1;3) (2;3) (3;3) (4;3) (5;3) (6;3) (7;3) (8;3) (9;3)
(0;4) (1;4) (2;4) (3;4) (4;4) (5;4) (6;4) (7;4) (8;4) (9;4)
(0;5) (1;5) (2;5) (3;5) (4;5) (5;5) (6;5) (7;5) (8;5) (9;5)
(0;6) (1;6) (2;6) (3;6) (4;6) (5;6) (6;6) (7;6) (8;6) (9;6)
(0;7) (1;7) (2;7) (3;7) (4;7) (5;7) (6;7) (7;7) (8;7) (9;7)
(0;8) (1;8) (2;8) (3;8) (4;8) (5;8) (6;8) (7;8) (8;8) (9;8)
(0;9) (1;9) (2;9) (3;9) (4;9) (5;9) (6;9) (7;9) (8;9) (9;9)
PRINT WITH EXTERN FUNCTION :
(9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0)
(9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1)
(9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2)
(9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3)
(9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4)
(9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5)
(9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6)
(9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7)
(9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8)
(9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9)
PRINT WITHOUT CREAT :
(9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0)
(9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1)
(9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2)
(9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3)
(9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4)
(9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5)
(9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6)
(9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7)
(9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8)
(9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9)
=> (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0)
(9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1)
(9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2)
(9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3)
(9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4)
(9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5)
(9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6)
(9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7)
(9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8)
(9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9)
TestDamier.rb(main):078:0> print "PRINT BY TO_S METHOD :\n"
PRINT BY TO_S METHOD :
=> nil
TestDamier.rb(main):079:0> print d
(9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0) (9;0)
(9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1) (9;1)
(9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2) (9;2)
(9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3) (9;3)
(9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4) (9;4)
(9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5) (9;5)
(9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6) (9;6)
(9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7) (9;7)
(9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8) (9;8)
(9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9) (9;9)
=> nil
我认为它是异常的:我想要一个CaseSimple的地图,其中每个CaseSimple都知道它自己的坐标。
我在Debian 7下工作,irb -v返回irb 0.9.6(09/06/30)。
感谢您的回复! (对不起我的英语)
答案 0 :(得分:0)
您的主要问题是以下代码:
@cases = Array.new(10, Array.new(10,nil))
创建一个数组,其中所有顶级元素/行都相同,因此当您遍历顶级数组时,您分配给最后一行/元素的值将显示在所有行/元素上。
您需要使用:
@cases = Array.new(10) { Array.new(10) }
这在http://ruby-doc.org/core-2.0.0/Array.html#class-Array-label-Creating+Arrays中进行了讨论。