我正在努力打印一个物体。 我来自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。
答案 0 :(得分:0)
打印时@grid
变量的类型是什么?
事实证明它是@grid.random
返回的类型,并且它不是Grid
对象。您可以打印该类以确保并修复代码:
puts @grid.class
您共享的代码需要相当多的改进。 Ruby是一种非常宽松的语言,而且现在,代码管理不好。另外,我不认为惯用Ruby是实现目标所必需的,但代码可以简化很多,这将简化几个方面的推理,包括类型。