无法打印对象

时间:2016-01-30 23:33:13

标签: ruby tostring

我正在努力打印一个物体。 我来自Python,所以Ruby的OO方面并不那么难,但有些技巧很难学。 从来没有通过覆盖python中的to_s方法打印对象的问题,但在那里,我不能。我让你看下面的代码。 (我也试图在这个项目的小伙伴项目中维护rdoc)

gem "rmagick"
gem "rdoc"
require "rmagick"
require "rdoc/rdoc"
include Magick
##
# This class represents the complete +Game+
class Game
    # Debugging accessor
    attr_accessor :engine

    ##
    # Creates a new instance of the game
    def initialize()
        @engine = Engine.new
    end

    ##
    # Starts the engine
    def start()
        @engine.genRandomGrid()
    end
end
##
# This class represents the +Controller+ from +MVC+
class Engine
    # Debugging accessor
    attr_accessor :grid

    ##
    # Initiates the needed instance's variables
    def initialize(x = 10)
        @grid = Grid.new(x)
    end

    ##
    # Generates a x * x grid of +Cell+ with false value/state
    def genNewGrid(x = 10)
        @grid = Grid.new(x)
    end

    ##
    # Fills the current grid with random value
    def genRandomGrid()
        @grid.randomGrid()
        p @grid
    end

    ##
    # Fills the current grid with picture's values
    def genPictureGrid(path)
        @grid.picture(path)
    end
end

##
# This class represents a +Grid+
class Grid 
    # Debugging accessor
    attr_accessor :maxLen #Longueur/Largeur
    # Debugging accessor
    attr_accessor :matrix #2 listes. Voir object Cell
    # Debugging accessor
    attr_accessor :xIndices #Les indices au dessus des abscisses 
    # Debugging accessor
    attr_accessor :yIndices #Les indices à gauche des ordonnées

    ##
    # Initializes +@grid+, +@xIndices+ and +@yIndices+ with 2D Array
    def initialize(x = 10)
        @maxLen = x
        @matrix = Array.new(x){Array.new(x){Cell.new(false, false)}}
        @xIndices = Array.new(x){Array.new}
        @yIndices = Array.new(x){Array.new}
    end

    ##
    # Turns to false a true cell state and to true a false cell state
    def changeCellState(x, y)
        @matrix[x][y].changeState
    end

    ##
    # Returns the @maxLen if needed
    def getLength()
        return @maxLen
    end

    ##
    # Generates "randomly" the value of each grid's cell
    def randomGrid()
        @matrix.each do |j|
            j.each do |x|
                rand_value = Random.srand(Random.new_seed)
                if ( rand_value % 2) == 0
                    x.setValue(true)
                else
                    x.setValue(false)
                end
            end
        end
        evalIndices()
        # NB : Class is array
        p #{@matrix}
    end

    ##
    # TODO : Generates a grid from a picture
    def picture()

    end

    ##
    # Fills +@xIndices+ and +@yIndices+ with right values
    def evalIndices()
        _row = 0
        _in = false
        _nb = 0
        @matrix.each do |j|
            _in = false
            _nb = 0
            j.each do |x|
                if x.getValue
                    _in = true
                    _nb += 1
                elsif _in
                    @xIndices[_row].push(_nb)
                    _in = false
                    _nb = 0
                end
            end
            if _in
                @xIndices[_row].push(_nb)
                _in = false
                _nb = 0
            end
            _row += 1
        end

        for j in 0..@maxLen-1
            _in = false
            _nb = 0
            for i in 0..@maxLen-1
                if @matrix[i][j].getValue 
                    _in = true
                    _nb += 1
                elsif _in
                    @yIndices[j].push(_nb)
                    _in = false
                    _nb = 0
                end
            end
            if _in
                @yIndices[j].push(_nb)
                _in = false
                _nb = 0
            end
        end
    end

    def to_s
        ret = ""
        @matrix.each do |j|
            j.each do |cell|
                ret += cell.getValue
            end
            ret += "\n"
        end
        return ret
    end
end


##
#  This class represents a +Cell+
class Cell
    # Debugging accessor
    attr_accessor :state #Etat graphique (GUI)
    # Debugging accessor
    attr_accessor :value #Valeur réelle (MOTEUR)

    ##
    # Initializes the +@state+ and +@value+ with parameters
    def initialize(state, value)
        @state = state
        @value = value
    end

    ##
    # Makes the +Cell+ object printable
    def to_s
        if @value
            "[X]"
        else
            "[ ]"
        end
    end

    ##
    # Boolean access method
    def changeState()
        if @state == true
            @state = false
        else
            @state = true
        end
    end

    ##
    # Access method
    def setValue(value)
        @value = value
    end

    ##
    # Access method
    def getState()
        return @state
    end

    ##
    # Access method
    def getValue()
        return @value
    end

    ##
    # Verifies if +@state+ and +@value+ are the same
    def right?
        return @state && @value
    end
end


game = Game.new
game.start()

在引擎类中,我试图在genRandGrid方法中打印@grid,但它只打印0..9。

THX。

1 个答案:

答案 0 :(得分:0)

打印时@grid变量的类型是什么?

事实证明它是@grid.random返回的类型,并且它不是Grid对象。您可以打印该类以确保并修复代码:

puts @grid.class

您共享的代码需要相当多的改进。 Ruby是一种非常宽松的语言,而且现在,代码管理不好。另外,我不认为惯用Ruby是实现目标所必需的,但代码可以简化很多,这将简化几个方面的推理,包括类型。