Ruby:class在打印时修改其中一个属性

时间:2013-12-07 16:44:47

标签: ruby class instance ruby-1.9.3

我正在尝试管理自制对象的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)。

感谢您的回复! (对不起我的英语)

1 个答案:

答案 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中进行了讨论。